• 结构型模式-适配器模式


    一:定义

    将一个类的接口转换成客户希望的另外一个接口,使得原来由于接口不兼容而不能一起工作的那些类能一起工作。
    在这里插入图片描述

    适配器Adapter包含的主要角色

    • 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。标准的交流电源插头。
    • 适配者(Adaptoo)类:它是被访问和适配器的现存组件库中的组件接口。欧洲墙视插座。
    • 适配器(Adapter)类:它是一个转换器,通过继承或者引用适配者对象,把适配者接口转成目标接口,让客户按目标接口的格式访问适配器。交流电适配器。

    二:类适配器模式

    我们的电脑只能读取SD卡,现在我们有一张TF卡也需要使用电脑读取出来。此时我们就需要增加一个适配器来适配TF卡。

    适配者:SD卡。

    /**
     * 适配者
     */
    public interface SDCard {
        String readSD();
        void writeSD(String msg);
    }
    
    public class SDCardImpl implements SDCard {
        @Override
        public String readSD() {
            return "read sd card";
        }
    
        @Override
        public void writeSD(String msg) {
            System.out.println("write msg to sd card");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    目标:TF卡。

    public interface TFCard {
        String readTF();
        void writeTF(String msg);
    }
    
    
    public class TFCardImpl implements TFCard {
        @Override
        public String readTF() {
            return "read tf card";
        }
    
        @Override
        public void writeTF(String msg) {
            System.out.println("write msg to tf card");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    适配器类:需要继承目标实现类TFCardImpl,并且实现适配者接口SDCard。内部实现最终还是调用的是目标实现类的方法。

    public class TF2SDCardAdapter extends TFCardImpl implements SDCard {
        @Override
        public String readSD() {
            return this.readTF();
        }
    
        @Override
        public void writeSD(String msg) {
            this.writeTF(msg);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    电脑Computer

    public class Computer {
        public String readSD(SDCard sdCard) {
            return sdCard.readSD();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    Client

    public class Client {
        public static void main(String[] args) {
            Computer computer = new Computer();
            String sdCardMsg = computer.readSD(new SDCardImpl());
            System.out.println(sdCardMsg);
    
            // 读取TF卡
            String tfCardMsg = computer.readSD(new TF2SDCardAdapter());
            System.out.println(tfCardMsg);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    三:对象适配器模式

    类适配器模式 TF2SDCardAdapter extends TFCardImpl 需要继承目标实现类,java是单继承的,如果继承了目标实现类那么适配器类就不能再继承其它类了,这是类适配器不好的地方。

    对象适配器模式可以采用将现有组件库中的已经实现的组件引入适配类中,该类同时实现当前系统的业务接口。

    对象适配器模式不需要继承,只需要将目标对象引入作为属性即可。

    public class TFToSDCardAdapter implements SDCard {
    	// 目标接口
        private TFCard tfCard;
    	// 只提供一个有参构造函数
        public TFToSDCardAdapter(TFCard tfCard) {
            this.tfCard = tfCard;
        }
    
        @Override
        public String readSD() {
            return tfCard.readTF();
        }
    
        @Override
        public void writeSD(String msg) {
            tfCard.writeTF(msg);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    Client

    public class Client {
        public static void main(String[] args) {
            Computer computer = new Computer();
            String sdCardMsg = computer.readSD(new SDCardImpl());
            System.out.println(sdCardMsg);
    
            // 读取TF卡
            String tfCardMsg = computer.readSD(new TFToSDCardAdapter(new TFCardImpl()));
            System.out.println(tfCardMsg);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    四:应用场景

    • 以前开发的系统存在满足新系统功能需求的接口,但其接口同新系统的接口不一致,需要转换一下。
    • 使用第三方提供的组件,但组件接口定义和自己要求的接口定义不同。

    五:适配器模式简介

    适配器模式其实就是对目标对象的一种包装,然后暴露出来统一的方法签名而已。

  • 相关阅读:
    万字详解 | Java 函数式编程
    【虚拟化生态平台】平台架构图&思路和实现细节
    Java最全面试攻略,吃透25个技术栈Offer拿到手软
    Redis内存模型讲解
    树莓派开发笔记(十二):入手研华ADVANTECH工控树莓派UNO-220套件(一):介绍和运行系统
    8月刚入职字节跳动的测试开发面试题,附答案
    Java泛型和类型擦除
    Python Tcp编程
    数据库锁机制和我的理解
    pytorch算力与有效性分析
  • 原文地址:https://blog.csdn.net/vbirdbest/article/details/125884652