适配器模式(Adapter),将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式主要分为三类:类适配器模式、对象适配器模式、接口适配器。
适配器模式核心的有下面三个角色
使用继承的方式,将需要适配的类转换为目标接口的子类,实现目标接口的所有方法,同时继承适配类的实现,用以完成一些适配逻辑(即:适配器类需要继承不兼容对象类,同时使用不兼容对象类提供的能力实现标准接口)
手机充电需要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;
}
优点
- 安全可靠:封装了旧接口,对客户端透明,客户端代码无需修改
- 提高复用性:可以复用不兼容的类
- 扩展性好:在应用程序开发过程中,可以增加新的适配器和被适配对象
缺点
- 过多的适配器会导致系统结构复杂
对象适配器模式是适配器模式中常用的一种方法,基本思路是使用关联替换继承。适配器类直接继承不兼容类,导致他们之间的强耦合,根据合成复用原则在系统中尽量使用关联关系来替换继承,下面是修改后的UML类图,如下:
适配器模式的适用场景: