通知图标

欢迎访问津桥芝士站

设计模式-桥模式-C++

该帖子部分内容已隐藏
付费阅读
3积分
此内容为付费阅读,请付费后查看
来自AI助手的总结
桥接模式通过分离抽象与实现来提高系统灵活性和可扩展性,适用于多维度变化场景,但增加了复杂度。

一、引言

桥接模式是一种结构型设计模式,旨在通过将抽象部分与其实现部分分离,使得二者可以独立变化。这种模式具有将接口和实现分离的特点,从而增强了系统的灵活性和可扩展性。

二、使用场景

  1. 多个维度的变化:当系统的设计可能需要在多个维度进行变化时,桥接模式能够有效减少类的数量。比如,在图形绘制系统中,各种形状(圆形、方形等)和不同的颜色(红色、绿色等)可以组合。

  2. 避免类爆炸:当一个类在多个维度上变化时,继承方式可能导致大量的子类,使用桥接模式可以避免这种“类爆炸”问题。

  3. 运行时选择实现:在某些情况下,可能需要在运行时选择不同的实现。在这种情况下,通过桥接模式可以很方便地实现。

  4. 整理复杂系统:若类之间存在多个依赖关系,桥接模式可以帮助清晰地管理这些关系,使系统的结构更加明了。

三、优缺点

优点

  • 增强灵活性:可以独立地扩展抽象部分和实现部分,增加了系统的灵活性。
  • 减少类的数量:通过将实现与抽象级别分开,系统中的类数能够有效减少,方便了管理和维护。
  • 改善代码的可读性和可维护性:明确各部分的职责和功能, 代码结构更为清晰。

缺点

  • 增加系统复杂性:因为桥接模式引入了新的抽象层次,可能会增加系统的复杂性,让维护变得更加困难。
  • 不容易理解:桥接模式的抽象可能让新手开发者较难理解,特别是在参与多个组件的情况下,复杂的组合关系可能难以抓住要点。
  • 多类之间的间接调用性能影响:由于存在桥接结构,调用实现时可能会相对较慢,尽管这在大多数情况下不是问题。

四、代码示例

以下是一个桥接模式的C++实现示例。

#include <iostream>
#include <memory>

// 实现接口
class DrawingAPI {
public:
    virtual void drawCircle(double x, double y, double radius) = 0;
};

// 具体实现A
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;
    }
};

// 具体实现B
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 {
protected:
    std::shared_ptr<DrawingAPI> drawingAPI; // 一种实现的引用

public:
    Shape(std::shared_ptr<DrawingAPI> drawingAPI) : drawingAPI(drawingAPI) {}
    virtual void draw() = 0; // 抽象绘制方法
};

// 具体形状,圆形
class Circle : public Shape {
private:
    double x, y, radius;

public:
    Circle(double x, double y, double radius, std::shared_ptr<DrawingAPI> drawingAPI)
        : Shape(drawingAPI), x(x), y(y), radius(radius) {}

    void draw() override {
        drawingAPI->drawCircle(x, y, radius); // 委托给具体实现
    }
};

int main() {
    // 创建实现对象
    std::shared_ptr<DrawingAPI> api1 = std::make_shared<DrawingAPI1>();
    std::shared_ptr<DrawingAPI> api2 = std::make_shared<DrawingAPI2>();

    // 创建不同的形状对象
    Circle circle1(5, 10, 3, api1);
    Circle circle2(10, 20, 4, api2);

    // 绘制形状
    circle1.draw();
    circle2.draw();

    return 0;
}


代码解析

在上述示例中:

  • DrawingAPI 是实现接口,定义了绘制圆形所需的接口方法 drawCircle()。所有具体实现都必须实现这个接口。
  • DrawingAPI1 和 DrawingAPI2 是具体实现,将 drawCircle() 的功能实现出来。它们分别代表不同的绘图API。
  • Shape 是抽象类,持有一个 DrawingAPI 的引用,实现依赖于桥接的细节。
  • Circle 是具体形状类,继承自抽象类 Shape。它实现了具体的 draw() 方法,该方法通过引用 DrawingAPI 来实现绘制功能。
  • 在 main 函数中,创建了不同的 DrawingAPI 和 Circle 实例,然后调用 draw() 方法,展示了多种形状和实现的组合效果。

五、模式总结

桥接模式通过将抽象和实现的层次结构分开,提供了很高的灵活性和更好的维护性。适合于在多维变化中保持灵活性,避免了类数量的急剧增加。然而,桥接模式的复杂性和理解难度也不容小觑。因此,在需要动态扩展或存在不同变化因素时,可以考虑采用桥接模式,以达到系统的复用和扩展需求。使用时应注意设计的清晰性和维护的便利性。

请登录后发表评论

    没有回复内容