桥接模式(Bridge Pattern),作为结构型设计模式的一种,桥接模式的核心精髓在于解耦两个乃至多个维度的变化(本文仅以两个维度为例),确保各个维度能够独立演化,互不干扰。它构筑了一道横跨各个维度的桥梁,促进各维度顺畅交互的同时,保持各自的独立边界。
应用背景
桥接模式着重适用于多维度变化的系统,如图形编辑器开发这类功能,用户需求多变,要求形状与颜色组合灵活。传统做法易导致类爆炸,维护成本陡增。桥接模式适时介入,通过精妙设计,有效应对此类扩展性难题。形如下图:
结构
上文提到桥接模式的核心精髓在于解耦两个乃至多个维度的变化,故此其必存在两个或多个不同的维度;每个维度有自己的接口层和实现层
- 维度1抽象:定义了维度1抽象接口,并内含对维度2的引用,作为沟通的桥梁。如上图中的Shape类
- 维度2抽象:定义了维度2抽象接口,如上图中的Color类
- 维度1实现:实现维度1接口,承载实际操作逻辑。如上图中的Circle和Square类
- 维度2实现:实现维度2接口,承载实际操作逻辑。如上图中的Green和Gray类
代码实现
借助桥接模式书写上述的图形编辑器开发功能,具体代码如下:
代码语言:javascript复制// 定义颜色接口
class Color {
public:
virtual ~Color() {}
virtual void applyColor() const = 0;
};
// 定义具体颜色类
class Green : public Color {
public:
void applyColor() const override {
std::cout << "Applying green color." << std::endl;
}
};
class Gray : public Color {
public:
void applyColor() const override {
std::cout << "Applying gray color." << std::endl;
}
};
//定义形状接口类
class Shape {
protected:
Color* color;
public:
Shape(Color* c) : color(c) {}
virtual ~Shape() {}
virtual void draw() const = 0;
void setColor(Color* c) { color = c; }
};
//定义具体形状类
class Circle : public Shape {
public:
Circle(Color* c) : Shape(c) {}
void draw() const override {
std::cout << "Drawing a circle.";
color->applyColor();
}
};
class Square : public Shape {
public:
Square(Color* c) : Shape(c) {}
void draw() const override {
std::cout << "Drawing a square.";
color->applyColor();
}
};
//测试代码
int test_bridge() {
auto* gray = new Gray();
auto* green = new Green();
Shape* circle = new Circle(gray);
Shape* square = new Square(green);
circle->draw(); // 输出:Drawing a circle. Applying gray color.
square->draw(); // 输出:Drawing a square. Applying green color.
// 动态改变颜色
circle->setColor(green);
square->setColor(gray);
circle->draw(); // 输出:Drawing a circle. Applying green color.
square->draw(); // 输出:Drawing a square. Applying gray color.
delete circle;
delete square;
delete green;
delete gray;
return 0;
}
总结
桥接模式通过将各个维度分离,赋予了软件设计更高的灵活性和扩展性。它不仅减少了类的数量,简化了系统结构,还促进了代码的重用,提升了系统的维护性和可测试性。掌握桥接模式,无疑是我们C 开发者手中的一把利器,助我们在编程征途中游刃有余,创造出更加健壮和灵活的软件架构。