适配器模式
# 适配器模式
# 一、适配器模式
原理:适配器模式是一种结构型设计模式, 它能使接口不兼容的对象能够相互合作。
优缺点
- 1 优点
- 提高了类的复用性:通过使用适配器模式,可以使那些原本由于接口不兼容而不能一起工作的类能够在一起工作,从而提高了类的复用性。
- 提高了类的透明性和灵活性:客户端通过适配器来调用目标接口,增加了系统的灵活性和可扩展性。适配器的具体实现对客户端是透明的,客户端可以动态地对适配器进行替换。
- 解耦了客户端与目标类:适配器模式可以将客户端与具体的适配器类解耦,客户端只需知道目标接口,不需要了解具体的适配器类和适配器的具体实现。
- 符合开闭原则:通过引入适配器,可以在不修改现有代码的情况下使用新的接口,符合开闭原则。
- 2 缺点
- 增加了代码的复杂性:引入建造者模式需要定义更多的类和接口,可能会增加代码的复杂性,尤其是在项目规模较小的时候。
- 对象创建过程相对较慢:由于是分步创建对象,建造者模式的对象创建过程可能会比直接使用构造函数要慢。
- 对变化敏感:如果对象的构建步骤或者组成部分发生变化,需要修改建造者类及其相关实现,维护成本较高。
适用场景
- 希望使用一个已经存在的类,而它的接口不符合需求:适配器模式可以让一个已有类的接口适配到一个新的接口,从而使该类能够满足客户的需求。
- 创建一个可复用的类:该类可以和其他不相关的或不可预见的类协同工作,这些类不一定具有兼容的接口。
- 希望使用一些现有的子类:但是不可能对每一个子类都进行子类化来匹配它们的接口,在这种情况下,适配器模式可以通过适配器类来实现这一目的。
# 二、适配器模式基本代码
- 客户端接口/类
class Target {
public void request(){
System.out.println("1");
}
}
1
2
3
4
5
2
3
4
5
- 适配器
class Adapter extends Target{
private Adaptee adaptee = new Adaptee();
public void request(){
adaptee.specificRequest();
}
}
1
2
3
4
5
6
7
2
3
4
5
6
7
- 需要适配的类
class Adaptee {
public void specificRequest(){
System.out.println("2");
}
}
1
2
3
4
5
6
7
2
3
4
5
6
7
- 客户端代码
Target target = new Adapter();
target.request();//2
1
2
3
2
3
# 三、实现方式
- 确保至少有两个类的接口不兼容:
- 一个无法修改 (通常是第三方、 遗留系统或者存在众多已有依赖的类) 的功能性服务类。
- 一个或多个将受益于使用服务类的客户端类。
- 声明客户端接口, 描述客户端如何与服务交互。
- 创建遵循客户端接口的适配器类。 所有方法暂时都为空。
- 在适配器类中添加一个成员变量用于保存对于服务对象的引用。 通常情况下会通过构造函数对该成员变量进行初始化, 但有时在调用其方法时将该变量传递给适配器会更方便。
- 依次实现适配器类客户端接口的所有方法。 适配器会将实际工作委派给服务对象, 自身只负责接口或数据格式的转换。
- 客户端必须通过客户端接口使用适配器。 这样一来, 你就可以在不影响客户端代码的情况下修改或扩展适配器。
编辑 (opens new window)