OpenBMC适配器模式小白学习指南
一、适配器模式一句话理解
把一个类的接口转换成客户端期望的另一种接口,让原本不兼容的类可以一起工作。
二、OpenBMC中最简单的适配器示例
场景:旧温度传感器适配新接口
// 新系统需要的接口(目标接口)
class NewSensor {
public:virtual float read() = 0; // 返回摄氏度
};// 旧传感器实现(被适配者)
class OldSensor {
public:int getTemp() { return 45; } // 返回整型温度值
};// 适配器类
class SensorAdapter : public NewSensor {
private:OldSensor oldSensor;
public:float read() override {// 将int转换为floatreturn static_cast<float>(oldSensor.getTemp());}
};
使用方式
int main() {SensorAdapter adapter;cout << "当前温度: " << adapter.read() << "℃" << endl;return 0;
}
三、OpenBMC中实际应用流程
1. 识别不兼容的接口
- 新接口:
getValue(): double
- 旧实现:
read_temp(): int
2. 创建适配器类
class TempSensorAdapter : public SensorInterface {LegacyTempSensor legacySensor;
public:double getValue() override {return static_cast<double>(legacySensor.read_temp());}
};
3. 在工厂中使用
unique_ptr<SensorInterface> createSensor(string type) {if (type == "legacy") {return make_unique<TempSensorAdapter>();}// 其他传感器类型...
}
四、适配器模式三大好处
- 兼容旧代码:不改动原有类的情况下使用
- 单一职责:接口转换逻辑独立在适配器中
- 开闭原则:可以随时新增适配器而不影响客户端
五、什么时候用适配器模式?
✅ 需要将旧组件集成到新系统
✅ 需要使用不兼容接口的第三方库
✅ 需要统一多个类似但接口不同的类
六、真实案例:D-Bus接口适配
// 新D-Bus接口
class DBusSensor {
public:virtual string getProperty(string name) = 0;
};// 旧实现
class SysfsSensor {
public:char read_property(const char* name);
};// 适配器
class SysfsToDBusAdapter : public DBusSensor {SysfsSensor sensor;
public:string getProperty(string name) override {return string(sensor.read_property(name.c_str()));}
};
记住这个模式的本质:加个中间层,解决接口不匹配问题。在OpenBMC这种需要长期维护的嵌入式系统中,适配器模式能大大降低系统演进的成本。