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

结构型模式:桥接模式

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

cpp 复制代码
#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 Circle
    blueCircle.draw();        // 输出: Drawing Blue Circle
    greenCircle.draw();       // 输出: Drawing Green Circle

    redRectangle.draw();      // 输出: Drawing Red Rectangle
    blueRectangle.draw();     // 输出: Drawing Blue Rectangle
    greenRectangle.draw();    // 输出: Drawing Green Rectangle

    redTriangle.draw();       // 输出: Drawing Red Triangle
    blueTriangle.draw();      // 输出: Drawing Blue Triangle
    greenTriangle.draw();     // 输出: Drawing Green Triangle

    return 0;
}

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

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

cpp 复制代码
#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;
}

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

相关推荐
2601_956121978 小时前
二分算法(知识点+题目)
c++·算法
蒙奇·D·路飞-10 小时前
OpenClaw:开源的《合金弹头》精神续作与终极本地部署指南
c++·开源·mfc
董员外11 小时前
RAG 系统进化论(八):Agentic RAG(智能体式 RAG),从回答问题到完成任务
人工智能·后端·设计模式
小星星闪亮登场12 小时前
2026萌新联赛第三场-- (郑州轻工业大学)
数据结构·c++·经验分享·算法·贪心算法·排序算法·深度优先
梓䈑12 小时前
【用 Vibe Coding 实现的 C++17 在线判题系统】前端开发 + Web 自动化测试
前端·c++·ai编程
冻柠檬飞冰走茶12 小时前
PTA基础编程题目集 7-8超速判断(C++语言实现)
开发语言·数据结构·c++·算法
TunerT_TQ13 小时前
Valhalla 静态工程审阅 #018|MMCV 源码证据驱动评测【大厂开源基础设施特辑】
c++·开源·mfc·#计算机视觉·#商汤科技·#openmmlab·#静态源码审计
别动我齐刘海14 小时前
Day6 unitree_G1人形机器人GMR—— MotionInput
c语言·c++·人工智能·学习·机器学习·机器人·github
Henry Zhu12315 小时前
C++17 `weak_from_this` 详解:让对象安全地观察自己
c++
董员外15 小时前
RAG 系统进化论(七):Multimodal RAG(多模态 RAG),当知识存在于表格、图片和页面中
人工智能·后端·设计模式