GoF 23种经典的设计模式——桥接模式

GoF 23种经典的设计模式——桥接模式

桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。

这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类,这两种类型的类可被结构化改变而互不影响。

桥接模式的目的是将抽象与实现分离,使它们可以独立地变化,该模式通过将一个对象的抽象部分与它的实现部分分离,使它们可以独立地改变。它通过组合的方式,而不是继承的方式,将抽象和实现的部分连接起来。

桥接模式的几个关键角色:

  1. 抽象(Abstraction): 定义抽象接口,通常包含对实现接口的引用。抽象类是对高层业务逻辑的抽象,它包含了对实现的引用,并定义了高层次的操作。它可以是一个抽象类或者一个接口。
  2. 扩展抽象(Refined Abstraction): 对抽象的扩展,可以是抽象类的子类或具体实现类。扩展抽象类在抽象的基础上添加更多的功能或进行定制,同时仍然通过实现接口来调用实现。
  3. 实现(Implementor): 定义实现接口,提供基本操作的接口。实现接口是对底层操作的抽象,它可能是一个接口或者抽象类,定义了基本的操作方法。
  4. 具体实现(Concrete Implementor): 实现实现接口的具体类。具体实现类实现了底层的具体操作,供抽象和扩展抽象类调用。

1705393805557

  1. 增加灵活性: 如果系统需要在抽象和具体实现之间增加更多的灵活性,避免静态的继承关系,桥接模式是一个不错的选择。它允许抽象和实现独立变化,使得系统更容易扩展和维护。
  2. 避免多层次继承: 当系统不希望使用多层次继承,或者继承层次导致类的个数急剧增加时,桥接模式是一种有效的替代方案。通过桥接模式,可以减少继承的层次,将抽象和实现分离,避免类层次结构的膨胀。
  3. 独立变化的维度: 当一个类存在两个或多个独立变化的维度,且这些维度都需要进行扩展时,桥接模式非常适用。通过桥接模式,可以灵活地组合不同的抽象和实现,而不需要创建所有可能的组合,从而降低了系统的复杂性。

在这个例子中,我们有两个维度:ShapeColorShape 表示图形,Color 表示颜色。通过桥接模式,我们可以轻松地组合不同的形状和颜色。

#include <iostream>

// 实现接口
class Color
{
public:
    virtual void applyColor() = 0;
};

// 具体实现类
class Red : public Color
{
public:
    void applyColor() override
    {
        std::cout << "Applying red color" << std::endl;
    }
};

class Green : public Color
{
public:
    void applyColor() override
    {
        std::cout << "Applying green color" << std::endl;
    }
};

// 抽象类
class Shape
{
protected:
    Color *color;

public:
    Shape(Color *color) : color(color) {}

    virtual void draw() = 0;
};

// 扩展抽象类
class Circle : public Shape
{
public:
    Circle(Color *color) : Shape(color) {}

    void draw() override
    {
        std::cout << "Drawing circle ";
        color->applyColor();
    }
};

class Rectangle : public Shape
{
public:
    Rectangle(Color *color) : Shape(color) {}

    void draw() override
    {
        std::cout << "Drawing rectangle ";
        color->applyColor();
    }
};

int main()
{
    // 创建具体的形状和颜色
    Color *red = new Red();
    Color *green = new Green();

    Shape *redCircle = new Circle(red);
    Shape *greenRectangle = new Rectangle(green);

    // 绘制
    redCircle->draw();
    greenRectangle->draw();

    // 释放资源
    delete red;
    delete green;
    delete redCircle;
    delete greenRectangle;

    return 0;
}
------本页内容已结束,喜欢请分享------

文章作者
能不能吃完饭再说
隐私政策
PrivacyPolicy
用户协议
UseGenerator
许可协议
NC-SA 4.0


© 版权声明
THE END
喜欢就支持一下吧
点赞19赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片