设计模式-结构型-适配器模式(Adapter)
参考文献
适配器模式
-
将一个类的接口转换为客户期望的另一个接口.
-
适配器让类能够协同工作,否则由于接口不兼容而无法协同工作
-
分类
- 对象适配器
- 对象适配器使用组合关系,在适配器类中持有一个对于被适配者类的引用,并实现目标接口的方法,通过调用被适配者类的方法来完成任务.
- 类适配器
- 类适配器使用继承关系,在适配器类中同时继承目标接口和被适配者类,并实现目标接口的方法.
- 对象适配器
组件
Target
定义客户端使用的特定于域的接口Adapter
使接口适配者适应目标接口Adaptee
定义需要调整的现有接口Client
与符合Target
接口的对象协作
实现方式
-
定义目标接口(
Target Interface
): 这是适配器的目标,即客户端所期望使用的接口.它可以是一个新的接口或者是已有的接口.1
2
3public interface Payment {
void pay(double amount);
}1
2
3
4
5
6
7public class PaymentSystemImpl implements Payment {
public void pay(double amount) {
// 原始支付系统的支付逻辑
System.out.println("使用原始支付系统支付:" + amount + "元");
}
} -
创建适配器类(
Adapter Class
): 适配器类实现了目标接口,并持有一个对于被适配者(Adaptee
)对象的引用.- 实现适配器类: 在适配器类中,实现目标接口的方法,并在方法内部调用被适配者的相应方法来完成任务.
1
2
3
4
5
6
7
8
9
10
11
12public class AliPayAdapter implements Payment {
private AliPay aliPay;
public AliPayAdapter(AliPay aliPay) {
this.aliPay = aliPay;
}
public void pay(double amount) {
aliPay.payWithAliPay(amount);
}
} -
创建被适配者类(
Adaptee Class
): 被适配者类是需要被适配的旧接口或者已有的类.1
2
3
4
5
6public class AliPay {
public void payWithAliPay(double amount) {
// 支付宝支付的逻辑
System.out.println("使用支付宝支付:" + amount + "元");
}
} -
在客户端中使用适配器: 在客户端中,通过适配器对象来调用适配器类中实现的目标接口方法,实现与被适配者的交互.
1
2
3
4
5
6
7
8
9
10public class Main {
public static void main(String[] args) {
PaymentSystemImpl paymentSystem = new PaymentSystemImpl();
paymentSystem.pay(100.0); // 使用原始支付系统支付:100.0元
AliPay aliPay = new AliPay();
Payment aliPayAdapter = new AliPayAdapter(aliPay);
aliPayAdapter.pay(200.0); // 使用支付宝支付:200.0元
}
}
使用场景
-
适配器模式一般常用的使用场景有:
- 原有接口无法修改时;
- 原有接口功能太老旧时;
- 统一多个类的接口设计时;
- 需要过渡升级旧接口时;
- 需要依赖外部系统时;
- 适配不同数据格式时;
- 不同接口协议转换时。
-
总结起来,适配器模式的使用场景主要有这两大类:第一类就是原有接口功能不满足现有要求,需要在兼容老接口的同时做适当的扩展;第二类是有相似性的多个不同接口之间做功能的统一。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 HoleLin's Blog!