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

桥接模式用于将抽象部分与它的实现部分分离,使它们可以独立变化。在C++中,这通常通过类层次结构和指针或引用实现解耦。关键在于用组合代替继承,把可能变化的实现细节提取到另一个类体系中。
核心结构:抽象与实现分离
定义两个独立的类层级:一个是抽象(Abstraction),它包含一个指向实现(Implementor)的指针;另一个是实现基类及其具体实现。这样,修改实现不会影响抽象接口。
- Abstraction 类持有 Implementor 接口的指针,调用其方法
- Implementor 是实现接口,定义底层操作
- ConcreteImplementor 提供具体实现
- RefinedAbstraction 可扩展高层行为而不影响实现
代码示例:设备控制与远程操作
假设我们有不同设备(电视、收音机)和不同类型的遥控器(基础、静音)。设备类型和遥控方式应能独立扩展。
立即学习“C++免费学习笔记(深入)”;
#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。两者互不影响,符合开闭原则。基本上就这些,不复杂但容易忽略设计初衷。











