c++如何实现桥接设计模式_c++解耦抽象与实现

桥接模式通过组合将抽象与实现分离,使其独立扩展。定义Abstraction(遥控器)持有Implementor(设备)指针,各自形成类层级:Device为实现基类,TV和Radio提供具体实现;Remote为抽象基类,BasicRemote和EnhancedRemote扩展高层行为。运行时动态绑定,如BasicRemote控制TV,EnhancedRemote控制Radio,新增设备或遥控器无需修改对方代码,符合开闭原则。

桥接模式用于将抽象部分与它的实现部分分离,使它们可以独立变化。在C++中,这通常通过类层次结构和指针或引用实现解耦。关键在于用组合代替继承,把可能变化的实现细节提取到另一个类体系中。

核心结构:抽象与实现分离

定义两个独立的类层级:一个是抽象(Abstraction),它包含一个指向实现(Implementor)的指针;另一个是实现基类及其具体实现。这样,修改实现不会影响抽象接口。

  • Abstraction 类持有 Implementor 接口的指针,调用其方法
  • Implementor 是实现接口,定义底层操作
  • ConcreteImplementor 提供具体实现
  • RefinedAbstraction 可扩展高层行为而不影响实现

代码示例:设备控制与远程操作

假设我们有不同设备(电视、收音机)和不同类型的遥控器(基础、静音)。设备类型和遥控方式应能独立扩展。

#include 

// 实现接口:设备 class Device { public: virtual void turnOn() = 0; virtual void turnOff() = 0; virtual ~Device() = default; };

// 具体实现:电视 class TV : public Device { public: void turnOn() override { std::cout << "TV is turning on\n"; } void turnOff() override { std::cout << "TV is turning off\n"; } };

// 具体实现:收音机 class Radio : public Device { public: void turnOn() override { std::cout << "Radio is turning on\n"; } void turnOff() override { std::cout << "Radio is turning off\n"; } };

// 抽象:遥控器 class Remote { protected: Device device; public: explicit Remote(Device d) : device(d) {} virtual void power() = 0; virtual ~Remote() = default; };

// 具体抽象:基础遥控 class BasicRemote : public Remote { public: using Remote::Remote; void power() override { device->turnOn(); } };

// 扩展抽象:带关机功能的遥控 class EnhancedRemote : public Remote { public: using Remote::Remote; void power() override { if (/ some condition / true) { device->turnOn(); } else { device->turnOff(); } } void mute() { std::cout << "Muting device...\n"; } };

使用方式:运行时绑定

可以在程序运行时动态组合不同的抽象和实现,无需重新编译。

int main() {
    TV tv;
    Radio radio;
BasicRemote basicTv(&tv);
EnhancedRemote enhancedRadio(&radio);

basicTv.power();           // 输出: TV is turning on
enhancedRadio.power();     // 输出: Radio is turning on
enhancedRadio.mute();      // 输出: Muting device...

return 0;

}

通过这种方式,新增设备只需继承 Device,新增遥控器类型只需扩展 Remote。两者互不影响,符合开闭原则。基本上就这些,不复杂但容易忽略设计初衷。