模式定义
适配器模式(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
模式优势
复用性:无需修改适配者代码即可集成新功能。
灵活性:支持动态切换适配器类型(如不同厂商传感器)。