适配器模式(Adapter Pattern)
# 适配器模式(Adapter Pattern)
将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,适配器模式分为类结构型模式(继承)和对象结构型模式(组合)两种,前者(继承)类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。
别名也可以是 Wrapper,包装器

适配器模式:系统原来存在的所有接口都不能动。扩展一个新的类,来连接多个之前不同的类。
适配器模式(Adapter)包含以下主要角色。
目标(Target)接口:可以是抽象类或接口。客户希望直接用的接口
public interface Player {
String play();
}
1
2
3
4
2
3
4
public interface Translator {
String translate(String content);
}
1
2
3
4
2
3
4
适配者(Adaptee)类:隐藏的转换接口
public class MoviePlayer implements Player{
@Override
public String play() {
System.out.println("正在播放视频 你好世界!!!");
return "hello";
}
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
public class zh_Translator implements Translator {
@Override
public String translate(String content) {
if ("hello".equals(content)) {
return "你好";
} else if ("hello world".equals(content)) {
return "你好 世界";
} else {
return "烫烫烫";
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口。
继承的方式:类结构实现

public class TranslatorPlayer extends zh_Translator implements Player {
//被适配对象
private Player target;
public TranslatorPlayer(Player target) {
this.target = target;
}
@Override
public String play() {
String play = target.play();
//转换字幕
String translate = translate(play);
System.out.println("翻译字幕:" + translate);
return translate;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
测试
public static void main(String[] args) {
MoviePlayer player = new MoviePlayer();
TranslatorPlayer adapter = new TranslatorPlayer(player);
adapter.play();
}
1
2
3
4
5
2
3
4
5
组合方式:对象结构模式实现

public class TranslatorPlayer implements Player {
//被适配对象
private Player target;
//翻译器
private Translator translator = new zh_Translator();
public TranslatorPlayer(Player target) {
this.target = target;
}
@Override
public String play() {
String play = target.play();
//转换字幕 组合方式
String translate = translator.translate(play);
System.out.println("翻译字幕:" + translate);
return translate;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
测试
public static void main(String[] args) {
MoviePlayer player = new MoviePlayer();
TranslatorPlayer adapter = new TranslatorPlayer(player);
adapter.play();
}
1
2
3
4
5
2
3
4
5
# 应用场景
- Tomcat 如何将 Request 流转为标准 Request;
- tomcat.Request 接口
- servlet.Request 接口
- tomcat === CoyoteAdapte === ServletRequest
- Spring AOP 中的 AdvisorAdapter 是什么:增强的适配器
- 前置、后置、返回、结束 Advisor(通知方法)
- 底层真的目标方法
- Spring MVC 中经典的 HandlerAdapter 是什么;
- HelloController.hello()
- HandlerAdapter
- Servlet.doGet()
- SpringBoot 中 WebMvcConfigurerAdapter 为什么存在又取消
SpringMvc 中的 HandlerAdapter, 就使用了适配器模式
SpringMVC 处理请求的流程回顾
使用 HandlerAdapter 的原因分析: 可以看到处理器的类型不同,有多重实现方式,那么调用方式就不是确定的,如果需要直接调用 Controller 方法,需要调用的时候就得不断是使用 if else 来进行判断是哪一种子类然后执行。那么如果后面要扩展 Controller,就得修改原来的代码,这样违背了 OCP 原则。

# 适配器模式的注意事项和细节
- 三种命名方式,是根据 src 是以怎样的形式给到 Adapter(在 Adapter 里的形式)来命名的。
- 类适配器:以类给到,在 Adapter 里,就是将 src 当做类,继承 对象适配器:以对象给到,在 Adapter 里,将 src 作为一个对象,持有 接口适配器:以接口给到,在 Adapter 里,将 src 作为一个接口,实现
- Adapter 模式最大的作用还是将原本不兼容的接口融合在一起工作。
- 实际开发中,实现起来不拘泥于我们讲解的三种经典形式
编辑 (opens new window)
上次更新: 2023/12/13, 06:06:02