【c++设计模式之桥接模式】分析及示例
  yQAl4kecrO8W 2023年12月23日 14 0


描述

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

示例

下面是一个 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;
};

在这个示例中,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;
}

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

输出结果为:

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

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


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月23日 0

暂无评论

推荐阅读
yQAl4kecrO8W