适配器模式(Adapter Pattern)是一种结构型设计模式,它将一个类的接口转换成客户端所期望的另一个接口。适配器模式使得原本由于接口不匹配而无法一起工作的类能够协同工作。
组成部分
- 目标接口(Target Interface): 客户端期望的接口,适配器模式通过适配器将被适配者的接口转换为目标接口。
- 适配器(Adapter): 实现了目标接口,并包装了一个被适配者对象。适配器通过调用被适配者的方法来实现目标接口。
- 被适配者(Adaptee): 需要被适配的接口。适配器通过包装被适配者对象,使其能够与目标接口兼容。
应用场景
- 将遗留代码的接口与新的接口进行适配
- 将两个不兼容的接口的类进行适配。
- 将一个类的接口转换成另一个类的接口。
实现方式
- 类适配器模式: 适配器继承自被适配者,同时实现目标接口。通过继承,适配器可以重定义被适配者的方法,同时实现目标接口。
- 对象适配器模式: 适配器包含一个被适配者的对象实例,并实现目标接口。通过组合,适配器将目标接口的调用委托给被适配者对象。
类图
类适配器模式
对象适配器模式
代码
类适配器模式
#include <iostream>
// 目标接口
class ChineseSocket {
public:
virtual void powerSupply() const = 0;
};
// 被适配者
class UKPlug {
public:
void supplyPower() const {
std::cout << "Supply power with UK plug." << std::endl;
}
};
// 适配器,继承自被适配者,同时实现目标接口
class UKToChineseAdapter : public ChineseSocket, private UKPlug {
public:
void powerSupply() const override {
// 调用被适配者的方法
supplyPower();
}
};
int main() {
// 使用适配器连接英国插头到中国插座
UKToChineseAdapter adapter;
adapter.powerSupply();
return 0;
}
对象适配器模式
#include <iostream>
// 目标接口
class USASocket {
public:
virtual void powerSupply() const = 0;
};
// 被适配者,欧洲插头
class EuroPlug {
public:
void supplyPower() const {
std::cout << "Supply power with European plug." << std::endl;
}
};
// 适配器,包含被适配者的实例,并实现目标接口
class EuroToUSAdapter : public USASocket {
public:
explicit EuroToUSAdapter(const EuroPlug& euroPlug)
: euroPlug_(euroPlug) {}
void powerSupply() const override {
// 将欧洲插头的电源供应适配到美国插座
euroPlug_.supplyPower();
std::cout << "Adapter: Using Euro to US adapter." << std::endl;
}
private:
EuroPlug euroPlug_;
};
int main() {
// 使用对象适配器连接欧洲插头到美国插座
EuroPlug euroPlug;
EuroToUSAdapter adapter(euroPlug);
// 获取电源供应
adapter.powerSupply();
return 0;
}