桥接设计模式属于结构型设计模式,其核心目标是将抽象部分与实现部分分离,使两者可以独立演化,避免因为多维度变化导致类的数量急剧膨胀。在C++开发中,当某个类存在多个独立的变化维度时,使用桥接模式可以有效降低代码耦合度,提升系统的可维护性。

桥接模式的核心结构
桥接模式的角色主要分为四类:
- 抽象类(Abstraction):定义抽象部分的接口,持有一个实现类对象的引用。
- 扩展抽象类(RefinedAbstraction):继承抽象类,对抽象接口进行扩展。
- 实现类接口(Implementor):定义实现部分的接口,供抽象类调用。
- 具体实现类(ConcreteImplementor):实现实现类接口的具体逻辑。
C++实现桥接模式的步骤
1. 定义实现类接口
首先定义实现部分的接口,比如我们以图形绘制为例,实现类接口定义绘制的操作方法:
// 实现类接口:绘制接口
class DrawAPI {
public:
virtual ~DrawAPI() {}
// 绘制圆形的方法
virtual void drawCircle(int x, int y, int radius) = 0;
};
2. 实现具体实现类
根据实际的绘制需求,实现不同的具体绘制类:
// 具体实现类1:红色绘制
class RedDrawAPI : public DrawAPI {
public:
void drawCircle(int x, int y, int radius) override {
printf("使用红色绘制圆形,圆心坐标(%d,%d),半径%dn", x, y, radius);
}
};
// 具体实现类2:绿色绘制
class GreenDrawAPI : public DrawAPI {
public:
void drawCircle(int x, int y, int radius) override {
printf("使用绿色绘制圆形,圆心坐标(%d,%d),半径%dn", x, y, radius);
}
};
3. 定义抽象类
抽象类持有实现类接口的引用,定义抽象的图形操作接口:
// 抽象类:图形
class Shape {
protected:
// 持有实现类对象的引用
DrawAPI* drawAPI;
public:
Shape(DrawAPI* api) : drawAPI(api) {}
virtual ~Shape() {
if (drawAPI != nullptr) {
delete drawAPI;
drawAPI = nullptr;
}
}
// 抽象的绘制方法
virtual void draw() = 0;
};
4. 实现扩展抽象类
扩展抽象类继承抽象类,实现具体的抽象逻辑:
// 扩展抽象类:圆形
class Circle : public Shape {
private:
int x, y, radius;
public:
Circle(int x, int y, int radius, DrawAPI* api) : Shape(api), x(x), y(y), radius(radius) {}
void draw() override {
// 调用实现类的方法完成绘制
drawAPI->drawCircle(x, y, radius);
}
};
5. 客户端调用测试
在客户端中组合抽象类和实现类,验证桥接模式的效果:
#include <cstdio>
int main() {
// 创建红色绘制实现对象
DrawAPI* redApi = new RedDrawAPI();
// 创建使用红色绘制的圆形
Shape* redCircle = new Circle(10, 20, 5, redApi);
redCircle->draw();
// 创建绿色绘制实现对象
DrawAPI* greenApi = new GreenDrawAPI();
// 创建使用绿色绘制的圆形
Shape* greenCircle = new Circle(30, 40, 8, greenApi);
greenCircle->draw();
// 释放资源
delete redCircle;
delete greenCircle;
return 0;
}
运行结果分析
上述代码编译运行后,输出结果如下:
使用红色绘制圆形,圆心坐标(10,20),半径5 使用绿色绘制圆形,圆心坐标(30,40),半径8
可以看到,抽象部分的圆形和具体实现部分的绘制逻辑完全分离,如果需要新增绘制颜色,只需要新增DrawAPI的子类即可,不需要修改圆形相关的代码;如果需要新增图形类型,也只需要新增Shape的子类,不需要修改绘制相关的代码,完全符合开闭原则。
桥接模式的适用场景
- 当一个类存在两个或以上独立变化的维度,且这两个维度都需要扩展时。
- 当不希望使用继承导致类数量爆炸时,继承会让类的耦合度过高,难以维护。
- 当需要在抽象层和实现层之间增加灵活性,避免两者静态绑定,让它们可以动态组合时。
桥接模式的核心是通过组合代替继承,将多维度变化的逻辑拆分开,在实际使用时要注意抽象部分和实现部分的边界划分,避免划分不合理导致模式使用变得冗余。