23种设计模式 - 适配器模式
模式定义
适配器模式(Adapter Pattern)是一种结构型设计模式,用于解决接口不兼容问题。它通过将一个类的接口转换为客户端期望的接口,使原本因接口不匹配而无法协同工作的类能够协同工作。适配器模式分为类适配器(通过继承实现)和对象适配器(通过组合实现)两种类型。
模式结构
目标接口(Target):客户端期望的接口(如数控系统的传感器接口)。
适配者(Adaptee):需要被适配的现有类(如第三方传感器)。
适配器(Adapter):实现目标接口,并持有适配者的实例,负责接口转换。
适用场景
集成遗留系统或第三方组件时接口不兼容。
统一多个类接口以简化客户端调用(如数控系统中不同厂商的传感器)。
C++示例(数控系统场景)
场景说明:
数控系统需要读取传感器数据,但旧系统使用OldSensor
接口,新引入的第三方传感器NewSensor
接口不同,需通过适配器统一接口。
#include
#include
// 目标接口:数控系统期望的传感器接口
class Sensor {
public:
virtual ~Sensor() = default;
virtual std::string getData() = 0; // 统一的数据获取接口
};
// 旧传感器(直接兼容目标接口)
class OldSensor : public Sensor {
public:
std::string getData() override {
return "旧传感器数据: 转速=1500 RPM";
}
};
// 适配者:第三方新传感器(接口不兼容)
class NewSensor {
public:
std::string fetchData() {
return "新传感器数据: 温度=80°C, 振动=0.05mm";
}
};
// 对象适配器(组合方式)
class NewSensorAdapter : public Sensor {
private:
NewSensor* newSensor; // 持有适配者实例
public:
NewSensorAdapter(NewSensor* sensor) : newSensor(sensor) {}
std::string getData() override {
// 调用适配者的方法并转换格式
return "[适配后] " + newSensor->fetchData();
}
};
// 客户端(数控系统)
int main() {
// 使用旧传感器
Sensor* oldSensor = new OldSensor();
std::cout << oldSensor->getData() << std::endl;
// 使用适配后的新传感器
NewSensor newSensor;
Sensor* adaptedSensor = new NewSensorAdapter(&newSensor);
std::cout << adaptedSensor->getData() << std::endl;
delete oldSensor;
delete adaptedSensor;
return 0;
}
代码说明
目标接口:Sensor
定义了数控系统所需的getData()
方法。
适配者:NewSensor
提供实际功能但接口不兼容(fetchData()
)。
适配器:NewSensorAdapter
继承Sensor
并组合NewSensor
,在getData()
中调用fetchData()
并封装结果。
输出结果:
旧传感器数据: 转速=1500 RPM
[适配后] 新传感器数据: 温度=80°C, 振动=0.05mm
模式优势
复用性:无需修改适配者代码即可集成新功能。
灵活性:支持动态切换适配器类型(如不同厂商传感器)。