设计模式之适配器模式详解

一、什么是适配器模式

适配器模式(Adapter Pattern) 也称为变压器模式 ,它的功能是将一个类的接口变成客户端所期望的另一种接口,从而使原本因接口不匹配而导致无法在一起工作的两个类能够一起工作,属于结构型设计模式。适配器模式其实起着转化、委托的作用,将一种接口转化为另一种符合需求的接口。例如,当前系统存在两种接口A、B,客户只支持访问A接口,但是当前系统没有A接口对象,但是有B接口对象,但是客户又无法识别B接口,因此需要通过一个适配器C,将B接口内容转换成A接口,从而使得客户能够从A接口获取得到B接口内容。

二、适配器模式的角色组成

  • 目标角色(Target): 我们所期望的接口;
  • 源角色(Adaptee): 存在于系统中,内容满足客户需求(需转换),但接口不匹配的接口实例;
  • 适配器(Adapter): 将源角色(Adaptee)转化为目标角色(Target)的类实例;

三、适配器模式应用场景

提供一个转换器(适配器),将当前系统存在的一个对象转化为客户端能够访问的接口对象。

  • 已经存在的类,它的方法和需求不匹配(方法结果相同或者相似)的情况
  • 适配器模式不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产品、不同厂家造成功能类似而接口不相同情况下的解决方案

四、适配器模式–类适配器示例

类适配器的原理就是通过继承来实现适配器功能。具体做法:让Apapter实现Target接口,并且继承Apaptee,这样Apapter就具备Target和Apaptee的特性,就可以将两者进行转化。
下面通过以下功能做一个示例,我们假设系统只有一个能提供AC220V交流电的类,而我们手机充电需要5V的电压,这时我们通过一个电源适配器来进行转换,类适配器的类图如下:
在这里插入图片描述

  1. 创建Voltage220(Adaptee源角色)220V交流电的类
    /**
     * Adaptee 源角色 提供220V交流电
     *
     * @author zdp
     * @date 2022/9/17 15:07
     */
    public class Voltage220{
        public int provider220() {
            return 220;
        }
    }
    
  2. 创建Voltage5 (Target目标角色) 手机充电所需电压5V
    /**
     * 手机充电所需电压5V (目标角色Target)
     *
     * @author zdp
     * @date 2022/9/17 15:08
     */
    public interface Voltage5 {
    
        int require5();
    
    }
    
  3. 创建电源适配器 VoltageAdapter 将电压从220v转换为手机所需5v
    /**
     * 类适配器 Adapter  将电压从220v转换为手机所需5v
     *
     * @author zdp
     * @date 2022/9/17 15:08
     */
    public class VoltageAdapter extends Voltage220 implements Voltage5 {
        @Override
        public int require5() {
            int adapterInput = super.provider220();
            int adapterOutput =  adapterInput / 44 ;
            System.out.println("将源提供的" + adapterInput + "V~, 转换为手机所需电压 " + adapterOutput + "V~");
            return adapterOutput;
        }
    }
    
  4. 类适配器测试验证
    /**
     * 类适配器测试验证
     *
     * @author zdp
     * @date 2022/9/17 15:12
     */
    public class ClassAdapterTest {
        public static void main(String[] args) {
            Voltage5 voltage5 = new VoltageAdapter();
            voltage5.require5();
        }
    }
    

五、适配器模式–对象适配器示例

对象适配器的原理就是通过组合来实现适配器功能。具体做法:让Adapter实现Target接口,然后内部持有Adaptee实例,然后再Target接口规定的方法内转换Adaptee,对象适配器的类图:
在这里插入图片描述

  1. 源角色以及目标角色都使用上面的类适配器中的角色
  2. 创建对象适配器
    /**
     * 对象适配器 Adapter  将电压从220v转换为手机所需5v
     *
     * @author zdp
     * @date 2022/9/17 15:08
     */
    public class VoltageAdapter implements Voltage5 {
    
        private Voltage220 voltage220;
    
        public VoltageAdapter(Voltage220 voltage220) {
            this.voltage220 = voltage220;
        }
    
        @Override
        public int require5() {
            int adapterInput = voltage220.provider220();
            int adapterOutput =  adapterInput / 44 ;
            System.out.println("将源提供的" + adapterInput + "V~, 转换为手机所需电压 " + adapterOutput + "V~");
            return adapterOutput;
        }
    
    }
    
  3. 对象是适配器验证
    /**
     * 对象适配器测试验证
     *
     * @author zdp
     * @date 2022/9/17 15:12
     */
    public class ObjectAdapterTest {
        public static void main(String[] args) {
            Voltage5 voltage5 = new VoltageAdapter(new Voltage220());
            voltage5.require5();
        }
    }
    
    在这里插入图片描述

六、适配器模式优缺点

  • 优点
    • 能够提高类的透明性和复用,现有的类复用但不需要改变
    • 目标类和适配器解耦,提高程序的扩展性
    • 在很多业务场景中符合开闭原则
  • 缺点
    • 适配器编写过程需要全面考虑,可能会增加系统的复杂性
    • 增加代码阅读难度。降低代码可读性,过多使用适配器会使系统变得凌乱
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐