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

桥接模式用于将抽象部分与它的实现部分分离,使它们可以独立变化。在C++中,这通常通过类层次结构和指针或引用实现解耦。关键在于用组合代替继承,把可能变化的实现细节提取到另一个类体系中。
核心结构:抽象与实现分离
定义两个独立的类层级:一个是抽象(Abstraction),它包含一个指向实现(Implementor)的指针;另一个是实现基类及其具体实现。这样,修改实现不会影响抽象接口。
- Abstraction 类持有 Implementor 接口的指针,调用其方法
- Implementor 是实现接口,定义底层操作
- ConcreteImplementor 提供具体实现
- RefinedAbstraction 可扩展高层行为而不影响实现
代码示例:设备控制与远程操作
假设我们有不同设备(电视、收音机)和不同类型的遥控器(基础、静音)。设备类型和遥控方式应能独立扩展。
立即学习“C++免费学习笔记(深入)”;
#include <iostream>
<p>// 实现接口:设备
class Device {
public:
virtual void turnOn() = 0;
virtual void turnOff() = 0;
virtual ~Device() = default;
};</p><p>// 具体实现:电视
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";
}
};</p><p>// 具体实现:收音机
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";
}
};</p><p>// 抽象:遥控器
class Remote {
protected:
Device<em> device;
public:
explicit Remote(Device</em> d) : device(d) {}
virtual void power() = 0;
virtual ~Remote() = default;
};</p><p>// 具体抽象:基础遥控
class BasicRemote : public Remote {
public:
using Remote::Remote;
void power() override {
device->turnOn();
}
};</p><p>// 扩展抽象:带关机功能的遥控
class EnhancedRemote : public Remote {
public:
using Remote::Remote;
void power() override {
if (/<em> some condition </em>/ true) {
device->turnOn();
} else {
device->turnOff();
}
}
void mute() {
std::cout << "Muting device...\n";
}
};</p>使用方式:运行时绑定
可以在程序运行时动态组合不同的抽象和实现,无需重新编译。
int main() {
TV tv;
Radio radio;
<pre class='brush:php;toolbar:false;'>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。两者互不影响,符合开闭原则。基本上就这些,不复杂但容易忽略设计初衷。











