设计模式——桥接模式

2024-07-18 13:36:53 浏览数 (2)

桥接模式(Bridge Pattern),作为结构型设计模式的一种,桥接模式的核心精髓在于解耦两个乃至多个维度的变化(本文仅以两个维度为例),确保各个维度能够独立演化,互不干扰。它构筑了一道横跨各个维度的桥梁,促进各维度顺畅交互的同时,保持各自的独立边界。

应用背景

桥接模式着重适用于多维度变化的系统,如图形编辑器开发这类功能,用户需求多变,要求形状与颜色组合灵活。传统做法易导致类爆炸,维护成本陡增。桥接模式适时介入,通过精妙设计,有效应对此类扩展性难题。形如下图:

结构

上文提到桥接模式的核心精髓在于解耦两个乃至多个维度的变化,故此其必存在两个或多个不同的维度;每个维度有自己的接口层和实现层

  • 维度1抽象:定义了维度1抽象接口,并内含对维度2的引用,作为沟通的桥梁。如上图中的Shape类
  • 维度2抽象:定义了维度2抽象接口,如上图中的Color类
  • 维度1实现:实现维度1接口,承载实际操作逻辑。如上图中的Circle和Square类
  • 维度2实现:实现维度2接口,承载实际操作逻辑。如上图中的Green和Gray类

代码实现

借助桥接模式书写上述的图形编辑器开发功能,具体代码如下:

代码语言:javascript复制
// 定义颜色接口
class Color {
public:
    virtual ~Color() {}
    virtual void applyColor() const = 0;
};

// 定义具体颜色类
class Green : public Color {
public:
    void applyColor() const override {
        std::cout << "Applying green color." << std::endl;
    }
};

class Gray : public Color {
public:
    void applyColor() const override {
        std::cout << "Applying gray color." << std::endl;
    }
};

//定义形状接口类
class Shape {
protected:
    Color* color;
public:
    Shape(Color* c) : color(c) {}
    virtual ~Shape() {}
    virtual void draw() const = 0;
    void setColor(Color* c) { color = c; }
};

//定义具体形状类
class Circle : public Shape {
public:
    Circle(Color* c) : Shape(c) {}
    void draw() const override {
        std::cout << "Drawing a circle.";
        color->applyColor();
    }
};

class Square : public Shape {
public:
    Square(Color* c) : Shape(c) {}
    void draw() const override {
        std::cout << "Drawing a square.";
        color->applyColor();
    }
};

//测试代码
int test_bridge() {
    auto* gray = new Gray();
    auto* green = new Green();

    Shape* circle = new Circle(gray);
    Shape* square = new Square(green);

    circle->draw(); // 输出:Drawing a circle. Applying gray color.
    square->draw(); // 输出:Drawing a square. Applying green color.

    // 动态改变颜色
    circle->setColor(green);
    square->setColor(gray);

    circle->draw(); // 输出:Drawing a circle. Applying green color.
    square->draw(); // 输出:Drawing a square. Applying gray color.

    delete circle;
    delete square;
    delete green;
    delete gray;

    return 0;
}

总结

桥接模式通过将各个维度分离,赋予了软件设计更高的灵活性和扩展性。它不仅减少了类的数量,简化了系统结构,还促进了代码的重用,提升了系统的维护性和可测试性。掌握桥接模式,无疑是我们C 开发者手中的一把利器,助我们在编程征途中游刃有余,创造出更加健壮和灵活的软件架构。

0 人点赞