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

2024-01-17 09:43:37 浏览数 (3)

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

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

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

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

  1. 抽象(Abstraction): 定义抽象接口,通常包含对实现接口的引用。抽象类是对高层业务逻辑的抽象,它包含了对实现的引用,并定义了高层次的操作。它可以是一个抽象类或者一个接口。
  2. 扩展抽象(Refined Abstraction): 对抽象的扩展,可以是抽象类的子类或具体实现类。扩展抽象类在抽象的基础上添加更多的功能或进行定制,同时仍然通过实现接口来调用实现。
  3. 实现(Implementor): 定义实现接口,提供基本操作的接口。实现接口是对底层操作的抽象,它可能是一个接口或者抽象类,定义了基本的操作方法。
  4. 具体实现(Concrete Implementor): 实现实现接口的具体类。具体实现类实现了底层的具体操作,供抽象和扩展抽象类调用。
  1. 增加灵活性: 如果系统需要在抽象和具体实现之间增加更多的灵活性,避免静态的继承关系,桥接模式是一个不错的选择。它允许抽象和实现独立变化,使得系统更容易扩展和维护。
  2. 避免多层次继承: 当系统不希望使用多层次继承,或者继承层次导致类的个数急剧增加时,桥接模式是一种有效的替代方案。通过桥接模式,可以减少继承的层次,将抽象和实现分离,避免类层次结构的膨胀。
  3. 独立变化的维度: 当一个类存在两个或多个独立变化的维度,且这些维度都需要进行扩展时,桥接模式非常适用。通过桥接模式,可以灵活地组合不同的抽象和实现,而不需要创建所有可能的组合,从而降低了系统的复杂性。

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

代码语言:javascript复制
#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;
}

.post-copyright { box-shadow: 2px 2px 5px; line-height: 2; position: relative; margin: 40px 0 10px; padding: 10px 16px; border: 1px solid var(--light-grey); transition: box-shadow .3s ease-in-out; overflow: hidden; border-radius: 12px!important; background-color: var(--main-bg-color); } .post-copyright:before { position: absolute; right: -26px; top: -120px; content: 'f25e'; font-size: 200px; font-family: 'FontAwesome'; opacity: .2; } .post-copyright__title { font-size: 22px; } .post-copyright_type { font-size: 18px; color:var(--theme-color) } .post-copyright .post-copyright-info { padding-left: 6px; font-size: 15px; } .post-copyright-m-info .post-copyright-a, .post-copyright-m-info .post-copyright-c, .post-copyright-m-info .post-copyright-u { display: inline-block; width: fit-content; padding: 2px 5px; font-size: 15px; } .muted-3-color { color: var(--main-color); } /*手机优化*/ @media screen and (max-width:800px){.post-copyright-m-info{display:none}} ------本页内容已结束,喜欢请分享------

1 人点赞