欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 美景 > 【C++设计模式】结构型模式:桥接模式

【C++设计模式】结构型模式:桥接模式

2024/11/30 12:37:23 来源:https://blog.csdn.net/weixin_44378835/article/details/142737277  浏览:    关键词:【C++设计模式】结构型模式:桥接模式

结构型模式:桥接模式

假设你有一个绘图程序,需要支持绘制多种颜色的多种形状。如果直接将 n n n种形状和 m m m个颜色结合在一起,会导致类的数量急剧增加( n × m n\times m n×m个)。比如,3种形状(如圆形、矩形和三角形),3种颜色(如红色、蓝色和绿色)就需要9个类:

#include <iostream>// 形状类(圆形)
class RedCircle {
public:void draw() {std::cout << "Drawing Red Circle\n";}
};class BlueCircle {
public:void draw() {std::cout << "Drawing Blue Circle\n";}
};class GreenCircle {
public:void draw() {std::cout << "Drawing Green Circle\n";}
};// 形状类(矩形)
class RedRectangle {
public:void draw() {std::cout << "Drawing Red Rectangle\n";}
};class BlueRectangle {
public:void draw() {std::cout << "Drawing Blue Rectangle\n";}
};class GreenRectangle {
public:void draw() {std::cout << "Drawing Green Rectangle\n";}
};// 形状类(三角形)
class RedTriangle {
public:void draw() {std::cout << "Drawing Red Triangle\n";}
};class BlueTriangle {
public:void draw() {std::cout << "Drawing Blue Triangle\n";}
};class GreenTriangle {
public:void draw() {std::cout << "Drawing Green Triangle\n";}
};// 客户端代码
int main() {// 创建不同颜色的形状组合RedCircle redCircle;BlueCircle blueCircle;GreenCircle greenCircle;RedRectangle redRectangle;BlueRectangle blueRectangle;GreenRectangle greenRectangle;RedTriangle redTriangle;BlueTriangle blueTriangle;GreenTriangle greenTriangle;// 绘制形状redCircle.draw();         // 输出: Drawing Red CircleblueCircle.draw();        // 输出: Drawing Blue CirclegreenCircle.draw();       // 输出: Drawing Green CircleredRectangle.draw();      // 输出: Drawing Red RectangleblueRectangle.draw();     // 输出: Drawing Blue RectanglegreenRectangle.draw();    // 输出: Drawing Green RectangleredTriangle.draw();       // 输出: Drawing Red TriangleblueTriangle.draw();      // 输出: Drawing Blue TrianglegreenTriangle.draw();     // 输出: Drawing Green Trianglereturn 0;
}

桥接模式将“高层次的接口或类”与“低层次的接口或类”分离 (…形状有…颜色,形状比颜色高一层),使得系统具有更好的灵活性和可扩展性。

下面使用桥接模式改写上文的代码:

#include <iostream>
#include <memory>// 实现层次:颜色接口
class Color {
public:virtual void fill() = 0;virtual ~Color() = default;
};// 具体颜色类
class Red : public Color {
public:void fill() override {std::cout << "Filling with Red color\n";}
};class Blue : public Color {
public:void fill() override {std::cout << "Filling with Blue color\n";}
};class Green : public Color {
public:void fill() override {std::cout << "Filling with Green color\n";}
};// 抽象类:形状
class Shape {
protected:std::unique_ptr<Color> color;public:Shape(std::unique_ptr<Color> c) : color(std::move(c)) {}virtual void draw() = 0;virtual ~Shape() = default;
};// 具体形状类
class Circle : public Shape {
public:Circle(std::unique_ptr<Color> c) : Shape(std::move(c)) {}void draw() override {color->fill();std::cout << "Drawing Circle\n";}
};class Rectangle : public Shape {
public:Rectangle(std::unique_ptr<Color> c) : Shape(std::move(c)) {}void draw() override {color->fill();std::cout << "Drawing Rectangle\n";}
};class Triangle : public Shape {
public:Triangle(std::unique_ptr<Color> c) : Shape(std::move(c)) {}void draw() override {color->fill();std::cout << "Drawing Triangle\n";}
};// 客户端代码
int main() {// 创建不同颜色的形状组合std::unique_ptr<Shape> shapes[9];shapes[0] = std::make_unique<Circle>(std::make_unique<Red>());shapes[1] = std::make_unique<Circle>(std::make_unique<Blue>());shapes[2] = std::make_unique<Circle>(std::make_unique<Green>());shapes[3] = std::make_unique<Rectangle>(std::make_unique<Red>());shapes[4] = std::make_unique<Rectangle>(std::make_unique<Blue>());shapes[5] = std::make_unique<Rectangle>(std::make_unique<Green>());shapes[6] = std::make_unique<Triangle>(std::make_unique<Red>());shapes[7] = std::make_unique<Triangle>(std::make_unique<Blue>());shapes[8] = std::make_unique<Triangle>(std::make_unique<Green>());// 绘制形状for (const auto& shape : shapes) {shape->draw();}return 0;
}

在没有使用桥接模式的情况下,每种形状和颜色组合都需要一个独立的类,随着形状和颜色的增加,类的数量会迅速膨胀。通过桥接模式,你只需为形状和颜色分别定义类,这大大减少了需要实现的类的数量。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com