前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GoF 23种经典的设计模式——桥接模式

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

作者头像
Andromeda
发布2024-01-17 09:43:37
810
发布2024-01-17 09:43:37
举报
文章被收录于专栏:Andromeda的专栏Andromeda的专栏

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

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

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

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

  1. 抽象(Abstraction): 定义抽象接口,通常包含对实现接口的引用。抽象类是对高层业务逻辑的抽象,它包含了对实现的引用,并定义了高层次的操作。它可以是一个抽象类或者一个接口。
  2. 扩展抽象(Refined Abstraction): 对抽象的扩展,可以是抽象类的子类或具体实现类。扩展抽象类在抽象的基础上添加更多的功能或进行定制,同时仍然通过实现接口来调用实现。
  3. 实现(Implementor): 定义实现接口,提供基本操作的接口。实现接口是对底层操作的抽象,它可能是一个接口或者抽象类,定义了基本的操作方法。
  4. 具体实现(Concrete Implementor): 实现实现接口的具体类。具体实现类实现了底层的具体操作,供抽象和扩展抽象类调用。
1705393805557
1705393805557
  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}} ------本页内容已结束,喜欢请分享------

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com