美文网首页
7_适配器模式

7_适配器模式

作者: 真是个点子王 | 来源:发表于2021-01-11 14:12 被阅读0次
    • 将一个类的接口转换成客户希望的另外一个接口,使得原本因为接口不能兼容在一起工作的类变得可以在一起工作;
    • 适配器模式分为类适配器模式和对象适配器模式;

    结构

    • 目标(Target)接口:当前系统业务所期待的接口,可以是接口或者抽象类;
    • 适配者(Adaptee)类:它是被访问的和适配的现存组件库中的组件接口;
    • 适配器(Adapter)类:它是一个转换器,通过继承或者引用适配者对象,把是配置者接口转换成目标接口,让客户根据目标接口的格式访问适配者。

    类适配者模式

    • 定义一个适配器类来实现当前系统的业务接口,同时又继承现有组件库中已经存在的组件。
    • 实例:当前一台计算机可以读取SD卡中的内容,无法读取TF卡中的内容,利用适配器模式完成适配。
    • 分析:根据需求,我们最终的目的是需要以SD卡的方式来读取TF卡中的内容,因此对于角色划分,SD卡数据目标而TF属于适配者。
    // Computer.java
    public class Computer {
        // 从SD卡中读取数据
        public String readSD(SDCard sdCard){
            if(sdCard == null){
                throw new NullPointerException("sd card is not null");
            }
            return sdCard.readSD();
        }
    }
    
    // SDCard.java
    public interface SDCard {
        // 从SD卡中读取数据
        public String readSD();
        // 往SD卡中写数据
        public void writeSD(String msg);
    }
    
    // SDCardImpl.java
    public class SDCardImpl implements SDCard {
        @Override
        public String readSD() {
            String msg = "SDCard read msg : hello world SD";
            return msg;
        }
    
        @Override
        public void writeSD(String msg) {
            System.out.println("SDCard write msg : " + msg);
        }
    }
    
    // TFCard.java
    public interface TFCard {
        // 从TF卡中读取数据
        public String readTF();
    
        // 往TF卡中写入数据
        void writeTF(String msg);
    }
    
    // TFCardImpl.java
    public class TFCardImpl implements TFCard{
        @Override
        public String readTF() {
            String msg = "TFCard read msg : hello world TFCard";
            return msg;
        }
    
        @Override
        public void writeTF(String msg) {
            System.out.println("TFCard write:" + msg);
        }
    }
    
    // SDAdapterTF.java
    public class SDAdapterTF extends TFCardImpl implements SDCard{
        @Override
        public String readSD() {
            System.out.println("adapter read tf card");
            return readTF();
        }
    
        @Override
        public void writeSD(String msg) {
            System.out.println("adapter write tf card");
            writeTF(msg);
        }
    }
    
    // Client.java
    public class Client {
        public static void main(String[] args) {
            // 创建计算机对象
            Computer computer = new Computer();
    
            String msg = computer.readSD(new SDCardImpl());
    
            System.out.println(msg);
    
            System.out.println("==================");
    
            // 使用该计算机读取TF卡中的数据卡
            String msg1 = computer.readSD(new SDAdapterTF());
            System.out.println(msg1);
        }
    }
    
    • 类适配器模式违背了合成复用原则。
    • 类适配器是目标类有一个接口规范下可用。

    对象适配器模式

    // SDAdapterTF.java
    public class SDAdapterTF extends SDCardImpl {
    
        // 声明适配者类
        private TFCard tfCard;
    
        public SDAdapterTF(TFCard tfCard){
            this.tfCard = tfCard;
        }
    
        @Override
        public String readSD() {
            System.out.println("adapter read tf card");
            return tfCard.readTF();
        }
    
        @Override
        public void writeSD(String msg) {
            System.out.println("adapter write tf card");
            tfCard.writeTF(msg);
    
     // Client.java
    public class Client {
        public static void main(String[] args) {
            // 创建计算机对象
            Computer computer = new Computer();
    
            String msg = computer.readSD(new SDCardImpl());
    
            System.out.println(msg);
    
            System.out.println("==================");
    
            // 读取TF卡中的数据
            String msg1 = computer.readSD(new SDAdapterTF(new TFCardImpl()));
            System.out.println(msg1);
        }
    }
    
    • 对象适配器模式克服了上文说道的类适配器模式中的两个缺点。

    相关文章

      网友评论

          本文标题:7_适配器模式

          本文链接:https://www.haomeiwen.com/subject/wlwraktx.html