桥接模式(Bridge Pattern)是一种结构型设计模式,用于将抽象部分与其实现部分分离,使它们可以独立变化。该模式通过组合关系替代继承关系,有效避免多层继承带来的复杂性。
核心概念
- 抽象部分(Abstraction):定义高层控制逻辑(如设备遥控器)
- 实现部分(Implementation):定义底层基础操作(如设备本身)
- 解耦:抽象层通过组合持有实现层引用,而非直接继承
模式组成
- 实现接口(Implementation Interface)
- 具体实现类(Concrete Implementations)
- 抽象基类(Abstraction)
- 扩展抽象类(Refined Abstractions)
C++ 实现示例
我们以「设备-遥控器」为例进行说明:
#include <iostream>
// 实现接口:设备基类
class Device {
public:
virtual void powerOn() = 0;
virtual void powerOff() = 0;
virtual void setChannel(int channel) = 0;
virtual int getChannel() const = 0;
virtual ~Device() = default;
};
// 具体实现:电视机
class TV : public Device {
bool isOn = false;
int currentChannel = 1;
public:
void powerOn() override {
isOn = true;
std::cout << "TV is ON\n";
}
void powerOff() override {
isOn = false;
std::cout << "TV is OFF\n";
}
void setChannel(int channel) override {
if(isOn) currentChannel = channel;
std::cout << "TV channel set to " << channel << "\n";
}
int getChannel() const override { return currentChannel; }
};
// 具体实现:收音机
class Radio : public Device {
bool isOn = false;
int currentChannel = 100;
public:
void powerOn() override {
isOn = true;
std::cout << "Radio is ON\n";
}
void powerOff() override {
isOn = false;
std::cout << "Radio is OFF\n";
}
void setChannel(int channel) override {
if(isOn) currentChannel = channel;
std::cout << "Radio tuned to " << channel << " FM\n";
}
int getChannel() const override { return currentChannel; }
};
// 抽象基类:遥控器
class RemoteControl {
protected:
Device* device; // 桥接关键点:持有实现层引用
public:
explicit RemoteControl(Device* dev) : device(dev) {}
virtual ~RemoteControl() { delete device; }
virtual void togglePower() = 0;
virtual void channelUp() = 0;
virtual void channelDown() = 0;
};
// 扩展抽象:基础遥控器
class BasicRemote : public RemoteControl {
public:
using RemoteControl::RemoteControl;
void togglePower() override {
if(device->getChannel() == 0) { // 假设0为关闭状态
device->powerOn();
} else {
device->powerOff();
}
}
void channelUp() override {
device->setChannel(device->getChannel() + 1);
}
void channelDown() override {
device->setChannel(device->getChannel() - 1);
}
};
// 扩展抽象:高级遥控器
class AdvancedRemote : public BasicRemote {
public:
using BasicRemote::BasicRemote;
void mute() {
std::cout << "Muting device...\n";
device->setChannel(0);
}
};
// 使用示例
int main() {
// 组合不同设备和遥控器
RemoteControl* tvRemote = new BasicRemote(new TV());
tvRemote->togglePower(); // 打开电视
tvRemote->channelUp(); // 频道+1
RemoteControl* radioRemote = new AdvancedRemote(new Radio());
radioRemote->togglePower(); // 打开收音机
static_cast<AdvancedRemote*>(radioRemote)->mute(); // 静音
delete tvRemote;
delete radioRemote;
return 0;
}
关键优势
- 解耦抽象与实现:允许独立扩展遥控器和设备类型
- 运行时切换:可动态更换连接的设备
- 避免继承爆炸:新增设备类型时无需创建遥控器子类
- 单一职责原则:分离设备控制和设备操作逻辑
适用场景
- 需要平台无关的图形界面库
- 支持多种数据库的ORM框架
- 不同支付方式与支付渠道的组合
- 跨平台应用程序开发
模式特点
- 开放/关闭原则:可独立扩展抽象层和实现层
- 隐藏实现细节:客户端仅与抽象层交互
- 增加灵活性:运行时切换实现对象
桥接模式通过建立抽象层和实现层之间的桥梁关系,有效解决了多维度变化的组合问题,是处理复杂系统分层设计的有效手段。