Design Patterns(五) Adapter

The adapter pattern is adapting between classes and objects. Like any adapter in the real world it is used to be an interface, a bridge between two objects. In real world we have adapters for power supplies, adapters for camera memory cards, and so on. Probably everyone have seen some adapters for memory cards.

前言

    将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。根据适配器类与适配者类的关系不同,适配器模式可分为对象适配器和类适配器两种,在对象适配器模式中,适配器与适配者之间是关联关系;在类适配器模式中,适配器与适配者之间是继承(或实现)关系。

适配器模式

角色:
1)Target(目标抽象类):目标抽象类定义客户所需接口,可以是一个抽象类或接口,也可以是具体类。
2)Adapter(适配器类):适配器可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配,适配器类是适配器模式的核心,在对象适配器中,它通过继承Target并关联一个Adaptee对象使二者产生联系。
3)Adaptee(适配者类):适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下可能没有适配者类的源代码。

工作原理

1) 适配器模式:将一个类的接口转换成另一种接口.让 原本接口不兼容的类可以兼容;
2) 从用户的角度看不到被适配者,是解耦的;
3) 用户调用适配器转化出来的目标接口方法,适配器再调用被适配者的相关接口方法;
4) 用户收到反馈结果,感觉只是和目标接口交互。

适配器模式-UML图:


代码:

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/**
* @Auther: Arsenal
* @Date: 2020-03-12 22:06
* @Description: 适配器模式
*/
public class Adapter {
public static void main(String[] args) {
new PlayerAdater(new MP4()).action();
}
}

/**
* Adaptee
*/
class MP4 {
void play() {
System.out.println("MP4播放");
}
}

/**
* Target
*/
interface Player {
void action();
}

/**
* Adapter
*/
class PlayerAdater implements Player {

MP4 mp4;

public PlayerAdater(MP4 mp4) {
this.mp4 = mp4;
}

@Override
public void action() {
if (mp4 != null) {
mp4.play();
System.out.println("改成Player播放");
}
}
}

总结

适配器模式(Adapter)通常适用于以下场景。

1) 以前开发的系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致。

2) 使用第三方提供的组件,但组件接口定义和自己要求的接口定义不同。

延伸

    Adapter Pattern
    浅谈Java适配器模式
    适配器设计模式的两种实现方法
    适配器模式(Adapter模式)详解
    设计模式 | 适配器模式及典型应用
    尚硅谷Java设计模式,韩顺平图解java设计模式

Content
  1. 1. 前言
  2. 2. 适配器模式
  3. 3. 总结
  4. 4. 延伸