• 【c++设计模式之桥接模式】分析及示例


    描述

    桥接模式是一种结构型设计模式,其目的是将抽象部分和实现部分分离开来,使得它们可以独立地变化。
    在桥接模式中,将抽象部分定义为一个接口(也可以是抽象类),实现部分也定义为一个接口,并且在抽象部分中包含一个实现部分的引用。这样,抽象部分和实现部分就可以分别变化,而不会相互影响。
    桥接模式可以用来处理多层继承结构,将类的功能层次结构与类的实现层次结构分离出来,从而使它们可以独立地扩展。

    示例

    下面是一个 c++ 桥接模式的示例,其中包含了一个抽象部分和两个实现部分:

    class DrawingAPI {
    public:
        virtual ~DrawingAPI() {};
        virtual void drawCircle(double x, double y, double radius) = 0;
    };
    
    class DrawingAPI1 : public DrawingAPI {
    public:
        void drawCircle(double x, double y, double radius) override {
            std::cout << "API1.circle at (" << x << ':' << y << ')'
                << " radius " << radius << std::endl;
        }
    };
    
    class DrawingAPI2 : public DrawingAPI {
    public:
        void drawCircle(double x, double y, double radius) override {
            std::cout << "API2.circle at (" << x << ':' << y << ')'
                << " radius " << radius << std::endl;
        }
    };
    
    class Shape {
    public:
        virtual ~Shape() {};
        virtual void draw() = 0;
        virtual void resizeByPercentage(double pct) = 0;
    };
    
    class CircleShape : public Shape {
    public:
        CircleShape(double x, double y, double radius, DrawingAPI* drawingAPI)
            :m_x(x), m_y(y), m_radius(radius), m_drawingAPI(drawingAPI) {}
    
        void draw() override {
            m_drawingAPI->drawCircle(m_x, m_y, m_radius);
        }
    
        void resizeByPercentage(double pct) override {
            m_radius *= pct;
        }
    
    private:
        double m_x, m_y, m_radius;
        DrawingAPI* m_drawingAPI;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    在这个示例中,DrawingAPI 是定义实现部分的接口。DrawingAPI1DrawingAPI2 是两个具体的实现类。Shape 是定义抽象部分的接口,并包含了一个 DrawingAPI 的指针成员变量 m_drawingAPICircleShape 是一个实现了 Shape 接口的具体类,其构造函数中包含了 m_drawingAPI 的初始化。

    可以通过以下方式使用这个桥接模式的示例:

    int main() {
        DrawingAPI1 drawingAPI1;
        DrawingAPI2 drawingAPI2;
    
        CircleShape circle1(1, 2, 3, &drawingAPI1);
        CircleShape circle2(5, 7, 11, &drawingAPI2);
    
        circle1.resizeByPercentage(2.5);
        circle2.resizeByPercentage(2.5);
    
        circle1.draw();
        circle2.draw();
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在主函数中,定义了两个具体的实现类 DrawingAPI1DrawingAPI2,然后分别传递给两个具体的 CircleShape 对象。在对两个 CircleShape 对象进行一定的操作(调用 resizeByPercentage 函数),然后分别调用它们的 draw 函数,输出结果。

    输出结果为:

    API1.circle at (1:2) radius 7.5
    API2.circle at (5:7) radius 27.5
    
    • 1
    • 2

    从输出结果可以看出,CircleShapedraw 函数成功地将抽象部分和实现部分分离开来,并且可以独立地变化。

  • 相关阅读:
    算法通关村第18关【青铜】| 回溯
    动词不规则变化
    docker容器之网络模型动手实验篇一
    MySQL 中 WHERE 和 HAVING 的区别
    搭建Lua与C/C++交互的环境
    npm install @antv/xflow无法下载该依赖
    数据结构·顺序表
    【重识云原生】第六章容器6.4.2.3节——Pod使用(下)
    ubuntu 搭建RKNN-Toolkit环境
    scau Java综合性实验之Java源程序分析程序
  • 原文地址:https://blog.csdn.net/MrHHHHHH/article/details/133388019