设计模式---适配器(Adapter)模式

1 引言

在实际生活中,常常发生两个对象不能直接交互需要一个第三方对象做适配的情况,例如,手机与SIM卡,需要一个卡托,从而实现SIM卡的读入。再比如,手机充电器,把220v的交流电压转换成5v直流电压,从而为手机提供充电电源。在软件设计中也会出现此种情况,此时我们可以用适配器模式解决问题。

2 定义 

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

3 结构与实现

适配器模式主要包含以下三个主要角色:

1.目标(Target):当前系统所能直接应用的接口,可以是接口或者抽象类。

2.适配者(Adaptee):是系统想要访问但不能直接访问的类。

3.适配器(Adapter):一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。

以下图片来自引用2

4 优缺点

4.1 优点

1.客户端通过适配器可以透明地调用目标接口。

2.复用了现存的类,程序员不需要修改原有代码只需添加代码即可重用现有的适配者类。

3.将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。

4.2 缺点

适配器模式本身就是一个缺点,只有在不得已的情况下使用。适配器编写过程需要结合业务场景全面考虑,可能会增加系统的复杂性。增加代码阅读难度,降低代码可读性,过多使用适配器会使系统代码变得凌乱。

5 代码示例

给一个电源适配器的例子,插线板输出220V交流电压,通过电源适配器转换为5V的直流电压,给手机进行充电。

5.1 电压类 Voltage

@Data
@Builder
public class Voltage {

    /**
     * 电压类型 交流(AC) 直流(DC)
     */
    private String type;
    /**
     * 电压值
     */
    private int value;
}

5.2 插线板 PatchBoard

/**
 * @program: design-pattern-learning
 * @author: zgr
 * @create: 2021-10-13 11:07
 * @desc: 插线板,设计好以后不允许修改
 **/
public final class PatchBoard {

    public Voltage giveVoltage(){
        return Voltage.builder()
                .type("AC")
                .value(220)
                .build();
    }
}

5.3 目标类 Target

/**
 * @program: design-pattern-learning
 * @author: zgr
 * @create: 2021-10-13 11:15
 **/
public interface Target {

    /**
     * 充电
     * @return 5v 直流电
     */
    Voltage charge();
}

5.4 电源适配器 PowerAdapter

/**
 * @program: design-pattern-learning
 * @author: zgr
 * @create: 2021-10-13 11:15
 * @desc 充电器
 **/
public class PowerAdapter implements Target{

    private PatchBoard patchBoard;

    public PowerAdapter(PatchBoard patchBoard){
        this.patchBoard = patchBoard;
    }

    @Override
    public Voltage charge() {
        Voltage voltage = patchBoard.giveVoltage();
        //电压转换
        voltage.setType("DC");
        voltage.setValue(5);
        return voltage;
    }
}

5.5 主函数 MainClass

/**
 * @program: design-pattern-learning
 * @author: zgr
 * @create: 2021-10-13 11:05
 **/
public class MainClass {

    public static void main(String[] args) {
        //想要给手机充电
        //1.找到插线板
        PatchBoard patchBoard = new PatchBoard();
        Voltage voltageAc = patchBoard.giveVoltage();
        System.out.println("插板给电:" + voltageAc);
        //2.拿出电源适配器
        Target target = new PowerAdapter(patchBoard);
        //3.充电
        Voltage voltageDc = target.charge();
        System.out.println("适配器给电:" + voltageDc);

    }
}

5.6 运行结果

5.7 总结

 我们的目标是充电,插线板给的电压不能使用,祭出适配器进行转换,从而满足充电电压的需求。

6 引用

1.《大话设计模式》

2.适配器模式(Adapter模式)详解

7 源代码

design-pattern-learning/src/com/hz/design/pattern/adapter at main · airhonor/design-pattern-learning · GitHub

猜你喜欢

转载自blog.csdn.net/honor_zhang/article/details/120738884