一、适配器模式
1、原理
适配器模式(Adapter),将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式主要分为三类:类适配器模式、对象适配器模式、接口适配器。
2、角色
适配器模式核心的有下面三个角色
- 源对象:需要被适配的不兼容对象
- 目标接口:适配器对象要实现的标准接口
- 适配器对象:该对象使用不兼容对象提供的能力实现标准接口
3、类适配器模式
3.1、实现原理
使用继承的方式,将需要适配的类转换为目标接口的子类,实现目标接口的所有方法,同时继承适配类的实现,用以完成一些适配逻辑(即:适配器类需要继承不兼容对象类,同时使用不兼容对象类提供的能力实现标准接口)
手机充电需要5V电压,但是标准的家庭用电电压是220V,下面通过案例来讲解如果通过类适配器模式把220V电压转换成手机需要的5V电压,UML类图如下:
代码实现
#include <iostream>
using namespace std;
// 被适配类(不兼容对象类)
class Voltage220V{
public:
// 输出220V电压
int Output220V(){
return 220;
}
};
// 适配接口(标准接口)
class IAdapter {
public:
virtual int Ouput5V() = 0;
};
// 适配器类
class VoltageAdapter : public IAdapter, Voltage220V {
public:
// 输出5V电压
int Ouput5V(){
int src = Output220V();
return src / 44;
}
};
// 手机类
class Phone{
public:
// 充电
void Charging(IAdapter *pAdapter){
pAdapter->Ouput5V();
}
};
int main()
{
Phone phone;
phone.Charging(new VoltageAdapter());
return 0;
}
3.2、优缺点分析
优点
- 安全可靠:封装了旧接口,对客户端透明,客户端代码无需修改
- 提高复用性:可以复用不兼容的类
- 扩展性好:在应用程序开发过程中,可以增加新的适配器和被适配对象
缺点
- 过多的适配器会导致系统结构复杂
4、对象适配器模式
对象适配器模式是适配器模式中常用的一种方法,基本思路是使用关联替换继承。适配器类直接继承不兼容类,导致他们之间的强耦合,根据合成复用原则在系统中尽量使用关联关系来替换继承,下面是修改后的UML类图,如下:
5、总结
适配器模式的适用场景:
- 重用现有的代码:适配器模式可以允许我们重用已有的类或接口,而不需要修改其原有的代码
- 集成老系统:当现有的系统不满足用户需求时,需要增加系统功能或接口。但是,老系统的接口可能与现有的技术、平台不兼容,此时可以采用适配器模式,将现有的接口适配为新的接口,从而实现新系统的集成
- 集成第三方组件:在使用第三方组件时,可能由于它们实现的 API 不同而导致应用程序复杂,此时可以使用适配器模式,将第三方组件提供的 API 适配为自己需要的 API,方便在应用程序中进行调用
- 实现跨平台兼容:在不同平台、不同技术栈之间进行开发时,常常需要适配不同的接口,以使得不同的平台或技术栈之间能够相互兼容,此时可以使用适配器模式来处理各种不兼容问题