适配器模式

适配器个人理解下来他的使用场景一般是用于

  • 在不改变原代码的基础上用适配器模式去改变他原有的代码(和代理模式是有区别的)
  • 版本迭代也可以用这个模式

菜鸟

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。

这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。

我们通过下面的实例来演示适配器模式的使用。其中,音频播放器设备只能播放 mp3 文件,通过使用一个更高级的音频播放器来播放 vlc 和 mp4 文件。

涉及相关角色

  • 被适配器(adaptee):原有的接口代码,需要被转换的代码
  • 目标:他定义了客户端需要的标准,他是被适配器和适配器的中间标准和规则的转换层,可以这么理解。它可以是接口也可以是抽象类,
  • 适配器(adapter):负责根据目标的标准和规范去实现转换的接口

分类

主要是适配器的继承和组合区别,组合就是在适配器中引用被适配器

  • 类适配器:(使用继承)简单理解就是 类适配器中的适配器角色==继承==被适配器和==实现==目标角色(注意看关键字,看示例也会知道区别)
  • 对象适配器:(使用组合)类适配器中的适配器角色==组合==被适配器和==实现==目标角色(注意看关键字,看示例也会知道区别)

对象适配器的好处就可以多实现,而且继承也是空缺的,类适配器已经堵住了继承

类适配器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// adaptee 被适配器
public class Adaptee{
public void round(){
System.out.println("圆孔耳机接口");
}
}
// target 目标
public interface Ttarget{
void typeC();
}

// adapter 适配器
public class Adapter extends Adapatee implements Target{
@Override
public void typeC(){
this.round()
System.out.println("进行转换");
System.out.println("Type-C 耳机接口");
}
}


// main
public static void main(String[] args){
Target newPort = new Adapter();
newPort.typeC(); // "圆孔耳机接口" "进行转换" "Type-C 耳机接口"
}

对象适配器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// adaptee 被适配器
public class Adaptee{
public void round(){
System.out.println("圆孔耳机接口");
}
}
// target 目标
public interface Ttarget{
void typeC();
}

// adapter 适配器
public class Adapter implements Target{ // 区别点
private Adaptee adaptee;
public Adapter(){
adaptee = new Adaptee();
}
@Override
public void typeC(){
this.adaptee.round();
System.out.println("进行转换");
System.out.println("Type-C 耳机接口");
}
}


// main
public static void main(String[] args){
Target newPort = new Adapter();
newPort.typeC(); // "圆孔耳机接口" "进行转换" "Type-C 耳机接口"
}

总结

适用场景:

  • 已经存在的类,它的方法和需求不匹配(方法结构相同或相似)的情况。
  • 使用第三方提供的组件,但组件接口定义和自己要求的接口定义不同。

优点:

  • 能提高类的透明性和复用,现有的类复用但不需要改变。
  • 目标类和适配器类解耦,提高程序的扩展性。
  • 在很多业务场景中符合开闭原则。

缺点:

  • 适配器编写过程需要全面考虑,可能会增加系统的复杂性。
  • 增加代码阅读难度,降级代码可读性,过多使用适配器会使系统代码变得凌乱。