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 类图
2. 适配器模式
2.1 定义
适配器模式(Adapter) 是一种结构型设计模式,能将一个类的接口变成客户端期待的另一种接口,从而使原本因接口不匹配无法在一起工作的两个类能在一起工作。
2.2 角色及结构
2.2.1 角色
- 目标角色(
Target):定义把其他类转换成哪种接口,也就是我们的期望接口,可以是具体的或抽象的类,也可以是接口; - 源角色(
Adaptee):想将谁转换成目标角色,“谁”就是源角色,也就是需要适配的类; - 适配器(
Adapter):新建立的核心角色,主要职责是通过继承或者是类关联的方式把源角色转为目标角色。
2.2.2 结构
2.3 适用场景
-
适配器模式用于解决接口不兼容的问题。想使用一个已经存在的类,但该类的接口和要求不同时,可考虑使用适配器模式;
-
适配器模式是一种“补救”模式,通常用来解决接口不相容的问题。要在双方都不太容易修改时再使用适配器模式,而不是一有不同就使用,如果接口不同,首先应该考虑通过重构统一接口。
2.4 优缺点
2.4.1 优点
-
可以让两个没有关系的类在一起运行;
-
增加了类的透明性:访问的
Target目标角色,具体实现都委托给了源角色,对高层次模块是透明的。 -
提高了类的复用度:源角色在原有系统中仍然可以正常使用,在目标角色中可以充当新的演员;
-
灵活性好:不想要就删除掉适配器,其余代码无需修改,即插即用。
2.4.2 缺点
- 使用适配器模式会引入额外的类和层次,可能导致系统结构变得更加复杂。
参考资料
- refactoringguru.cn/design-patt…
- 《大话设计模式》
- 《设计模式之禅》