• 【设计模式】27.结构型模式-适配器(Adapter)


    一、描述

    将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。

    1.角色

    (1)目标类(target):定义Client使用的与特定领域相关的接口。

    (2)客户端类(Client):与符合Target接口的对象协同。

    (3)需要适配的接口类(Adaptee):定义一个已经存在的接口,这个接口需要适配。

    (4)适配器(Adapter):对Adaptee的接口与Target接口进行适配。

    2.类图

    在这里插入图片描述

    3.适配器模式分为两类:类适配器和对象适配器。

    (1)类适配器:

    用一个具体的Adapter类对Adaptee和Target进行匹配。结果是当我们想要匹配一个类以及所有它的子类时,类Adapter将不能胜任工作。
    使得Adapter可以重定义Adaptee的部分行为,因为Adapter是Adaptee的一个子类。
    仅仅引入了一个对象,并不需要额外的指针以间接得到apaptee.

    (2)对象适配器:

    允许一个Adapter与多个Adaptee-----即Adaptee本身以及它的所有子类同时工作,Adapter也可以一次给所有的Adaptee添加功能。
    使得重定义Adaptee的行为比较困难。这就需要生成Adaptee的子类并且使得Adapter引用这个子类而不是引用Adaptee本身。

    二、优点

    1.解耦性:适配器让两个毫无关联的接口实现客户的功能。

    2.提高代码的复用性:适配的两方不需要修改逻辑,只需要专注于自身功能即可。通过适配器,可以让适配类实现客户需求,而不需要修改原有代码。

    3.提高系统扩展性:通过适配器适应多种场景。

    三、缺点

    1.过多使用适配器会使系统变得复杂且不好维护。

    四、适用场景

    1.当迁移系统时,如果不方便修改对外接口参数和返回时,可以添加适配器,将请求转化为新系统的请求。

    五、示例

    以"手机充电器将220V转为5V"为例

    1.创建220V类

    public class PowerSupply220 {
        public int output() {
            return 220;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.创建5V接口

    public interface PowerSupply5V {
        int dc5V();
    }
    
    • 1
    • 2
    • 3

    3.创建适配器实现5V接口

    public class InterfaceAdapter implements PowerSupply5V {
        private PowerSupply220 powerSupply;
    
        public InterfaceAdapter(PowerSupply220 powerSupply) {
            this.powerSupply = powerSupply;
        }
    
        @Override
        public int dc5V() {
            return powerSupply.output() / 44;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    4.测试

    @Slf4j
    public class InterfaceAdapterTest {
        public static void main(String[] args) {
            InterfaceAdapter interfaceAdapter = new InterfaceAdapter(new PowerSupply220());
            log.info("output:{}", interfaceAdapter.dc5V());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    效果:
    在这里插入图片描述

  • 相关阅读:
    cmake(14):利用set_property命令设置全局属性
    深入探索图像处理:从基础到高级应用
    论文速览 Arxiv 2023 | DMV3D: 单阶段3D生成方法
    大数据-玩转数据-Flink Sql 窗口
    [HDLBits] Exams/ece241 2013 q7
    多功能透明屏,在智能家居领域中,有哪些功能特点?显示、连接
    从零学算法946
    申报高企的条件你真的满足了吗?
    Web后端的前端:揭秘跨界融合的深度探索
    RabbitMQ 消息中间件
  • 原文地址:https://blog.csdn.net/CAT_cwds/article/details/126834025