• 适配器模式Adapter(Java实现)


    适配器模式-Adapter

    是作为两个不兼容的接口之间的桥梁.

    本篇文章的代码github地址: https://github.com/GoldArowana/design-patterns/tree/master/src/main/java/com/king/patterns/adapter

    先演示一下不使用适配器时的情况

    情景就是家里有插座, 电脑有充电器, 充电器不适用适配器, 直接插到插座上进行充电.

      

    Charger接口

    这个世界上有很多的充电器(Charger), 但是抽象出来的话, 都有以下两个功能:

    1. 充电(charge)

    2. 插在插座上(setElectricSocket)

    public interface Charger {
        public void charge();
        public void setElectricSocket(ElectricSocket electricSocket);
    }

    ElectricSocket接口

    这个世界上有很多不同的插座, 但是抽象出来的话, 都是用来供电的

    public interface ElectricSocket {
        void supplylEctricity();
    }

    TwoPlugsCharger类

    是一种两片插头的充电器. 如图所示:

    public class TwoPlugsCharger implements Charger {
    
        private ElectricSocket electricSocket;
    
        @Override
        public void setElectricSocket(ElectricSocket electricSocket) {
            this.electricSocket = electricSocket;
        }
    
        @Override
        public void charge() {
            System.out.println("使用[两片]插头充电器");
            electricSocket.supplylEctricity();
        }
    }

    TwoPlugsElectricSocket类

    是一种两片插孔的插座, 如图所示:

    public class TwoPlugsElectricSocket implements ElectricSocket {
        @Override
        public void supplylEctricity() {
            System.out.println("使用[两片]插座供电");
        }
    }

    Computer类

    public class Computer {
        private Charger charger;
    
        public void setCharger(Charger charger) {
            this.charger = charger;
        }
    
        public void startingUp() {
            charger.charge();
        }
    }

    People类

    People有电脑, 有充电器, 还可能需要充电器的适配器(适配器之后再提).

    我的充电器是两插片的充电器.

    public class People {
        private Computer computer;
        private Charger charger;
        private ElectricSocketAdapter adapter;
    
        public People() {
            this.computer = new Computer();
            this.charger = new TwoPlugsCharger();
        }
    
        /**
         * 如果需要适配器, 那就在这里设置
         */
        public void setAdapter(ElectricSocketAdapter adapter) {
            this.adapter = adapter;
        }
    
        /**
         * @param src 电源, 相对于对于充电器来说
         */
        public void connect(ElectricSocket src) {
            computer.setCharger(charger);
            if (adapter == null) {
                System.out.println("不需要适配器");
                charger.setElectricSocket(src);
            } else {
                adapter.setElectricSocket(src);
                charger.setElectricSocket(adapter);
            }
        }
    
        /**
         * 使用电脑, 开机
         */
        public void useComputer() {
            this.computer.startingUp();
        }
    }

    MyHome类

    本来用于运行测试.

    MyHome代表我家, 假设场景是我家只有一个"两片插口的插座", 

    在People类里也提到过, 我的充电器也正好是"两插片"的.

    所以我的充电器可以在我家直接使用.

    代码如下:

    public class MyHome {
        /**
         * 我家只有两片插口的插座
         */
        private static final ElectricSocket ELECTRIC_SOCKET = new TwoPlugsElectricSocket();
    
        public static void main(String[] args) {
            // 这个People是我
            People me = new People();
            
            // 我把电脑连接在我家的插座上
            me.connect(ELECTRIC_SOCKET);
            
            // 然后就可以用啦
            me.useComputer();
        }
    }
    

      

    接下来演示一下使用适配器时的情况

    还是笔记本充电器这个例子.

    只是有一天去了Hotel, 然后Hotel里的插座全都是三片插座. 我的"两片插头"的充电器无法直接进行使用.如下如所示:

    于是乎, 就搞来了一个适配器, 这个适配器的一头可以插进"三片插座"里, 另一头有"两片插孔"

    这样就可以让充电器先插到适配器上, 再把适配器插到三片插座就好了.

    ThreePlugsElectricSocket类

    三片插座, 如下图所示:

    public class ThreePlugsElectricSocket implements ElectricSocket {
        @Override
        public void supplylEctricity() {
            System.out.println("使用[三片]插座供电");
        }
    }

    ElectricSocketAdapter类

    之前的两片插头的充电器想要使用上面的三片插座来供电的话, 需要一个中间转换器来进行适配. 那就是适配器了.

    这里把适配器抽象为一个借口, 代码如下:

    public interface ElectricSocketAdapter extends ElectricSocket {
        @Override
        void supplylEctricity();
        void setElectricSocket(ElectricSocket electricSocket);
    }

    TwoPlugsAdapterToThree类

    这是一个适配器的实现, 用于适配: 两片插头->三片插座

    public class TwoPlugsAdapterToThree implements ElectricSocketAdapter {
        private ElectricSocket electricSocket;
    
        @Override
        public void setElectricSocket(ElectricSocket electricSocket) {
            this.electricSocket = electricSocket;
        }
    
        @Override
        public void supplylEctricity() {
            System.out.println("适配器负责将[两片]转为[三片]");
            electricSocket.supplylEctricity();
        }
    }

    Hotel类

    本来用于运行测试

    public class Hotel {
        /**
         * Hotel只有三片插座
         */
        private static final ElectricSocket ELECTRIC_SOCKET = new ThreePlugsElectricSocket();
    
        public static void main(String[] args) {
            // 这是我
            People me = new People();
    
            // 我提前带上了一个适配器
            ElectricSocketAdapter adapter = new TwoPlugsAdapterToThree();
    
            // 装备好适配器
            me.setAdapter(adapter);
    
            // 连接充电器等各种线
            me.connect(ELECTRIC_SOCKET);
    
            // 开始使用电脑
            me.useComputer();
        }
    }

     

    类关系图如下所示: 

    ---------------------------------------------------------
    学如不及,犹恐失之
  • 相关阅读:
    jvm 优化
    SqlServer体系结构
    sqlserver2012 在视图中建索引
    win10 桌面设置为远程桌面
    ORACLE 查询某表中的某个字段的类型,是否为空,是否有默认值等
    activemq读取剩余消息队列中消息的数量
    Oracl 一条sql语句 批量添加、修改数据
    ClickOnce一项Winform部署
    C#语言中的修饰符
    关于MySQL集群的一些看法
  • 原文地址:https://www.cnblogs.com/noKing/p/java_design_patterns_Adapter.html
Copyright © 2020-2023  润新知