【设计模式】一文速通适配器模式

110 阅读3分钟

1. 引入

小九购置了一部新手机,想用她的3.5mm耳机享受音乐。然而,她发现手机只有Type-C接口,耳机根本无法直接使用。没办法,她决定去买一个转接头。这个转接头就像一个桥梁,把两种不同的接口连接起来,让她可以使用耳机享受音乐。

这一过程正好体现了适配器模式的思想,通过引入一个新的适配器(转接头),解决了接口不兼容的问题。

1.1 详细代码实现

  • HeadPhone接口(Target
interface Headphone {
  // 播放声音
  void playAudio();
}
  • 3.5mm耳机类(Adaptee)
class ThreePointFiveMmHeadphone implements Headphone {
    @Override
    public void playAudio() {
        System.out.println("Playing audio through 3.5mm headphone.");
    }
}
  • 手机的Type-C接口
class TypeCDevice {
    public void connect(Headphone headphone) {
        headphone.playAudio();
    }
}
  • 适配器类(Adapter):创建适配器,用于将3.5mm耳机适配成可以被Type-C设备识别的接口。
class HeadphoneAdapter implements Headphone {
    private ThreePointFiveMmHeadphone headphone;

    public HeadphoneAdapter(ThreePointFiveMmHeadphone headphone) {
        this.headphone = headphone;
    }

    @Override
    public void playAudio() {
        // 调用3.5mm耳机的播放音频方法
        headphone.playAudio(); 
    }
}
  • 使用示例
public class client {
    public static void main(String[] args) {
        // 创建一个3.5mm耳机实例
        ThreePointFiveMmHeadphone headphone = new ThreePointFiveMmHeadphone();
        
        // 创建一个适配器,将3.5mm耳机适配为Type-C接口可用
        HeadphoneAdapter adapter = new HeadphoneAdapter(headphone);
        
        // 创建Type-C手机实例
        TypeCDevice phone = new TypeCDevice();
        
        // 使用适配器连接耳机到手机
        phone.connect(adapter);
    }
}

1.2 类图

image.png

2. 适配器模式

2.1 定义

适配器模式(Adapter) 是一种结构型设计模式,能将一个类的接口变成客户端期待的另一种接口,从而使原本因接口不匹配无法在一起工作的两个类能在一起工作。

image.png

2.2 角色及结构

2.2.1 角色

  • 目标角色Target):定义把其他类转换成哪种接口,也就是我们的期望接口,可以是具体的或抽象的类,也可以是接口;
  • 源角色Adaptee):想将谁转换成目标角色,“谁”就是源角色,也就是需要适配的类;
  • 适配器Adapter):新建立的核心角色,主要职责是通过继承或者是类关联的方式把源角色转为目标角色。

2.2.2 结构

image.png

2.3 适用场景

  • 适配器模式用于解决接口不兼容的问题。想使用一个已经存在的类,但该类的接口和要求不同时,可考虑使用适配器模式;

  • 适配器模式是一种“补救”模式,通常用来解决接口不相容的问题。要在双方都不太容易修改时再使用适配器模式,而不是一有不同就使用,如果接口不同,首先应该考虑通过重构统一接口。

2.4 优缺点

2.4.1 优点

  • 可以让两个没有关系的类在一起运行;

  • 增加了类的透明性:访问的Target目标角色,具体实现都委托给了源角色,对高层次模块是透明的。

  • 提高了类的复用度:源角色在原有系统中仍然可以正常使用,在目标角色中可以充当新的演员;

  • 灵活性好:不想要就删除掉适配器,其余代码无需修改,即插即用。

2.4.2 缺点

  • 使用适配器模式会引入额外的类和层次,可能导致系统结构变得更加复杂。

参考资料