设计模式——桥接模式

桥接模式(Bridge)

  在学习面向对象的过程中,可能会陷入一个误区,只要可以用,都用上继承,就好比因为有了新锤子,看什么东西都像是钉子了。
  事实上,继承可能会带来一些麻烦。比如对象的继承关系是在编译阶段就定义好的,所以无法在运行时改变从父类继承的实现。子类的实现与其父类有非常紧密的依赖关系,父类的变化必然导致子类的变化。当需要复用子类的时候,如果继承下来的实现不适用于解决新的问题,则父类必须重写或用更合适的类替换。这种依赖关系限制了灵活性并最终限制了复用性。

合成(Composition)/聚合(Aggregation)复用原则(CARP)

  尽量使用合成/聚合,尽量不要使用类继承。

  这就是为什么说多用组合,少用继承。

  聚合表示一种弱的“拥有”关系,体现的是A对象可以包含B对象,但是B对象不是A对象的一部分;
合成也叫组合,是一种强的“拥有”关系,体现了严格的部分和整体的关系,部分和整体的生命周期是一样的。
大雁和翅膀是整体和部分的关系,生命周期一样,所以是组合关系。
大雁属于一个雁群,所以是聚合关系。

在这里插入图片描述

  合成/聚合复用原则的好处是:优先使用对象的合成/聚合有助于保持每个类被封装,并且集中在单个任务上。这样类和类继承层次会保持较小的规模,不容易发展成庞然大物。

桥接模式

  将抽象部分与它的实现部分分离,使他们都可以独立地变化

  例如手机既可以按照品牌分类,也可以按照功能分类。

在这里插入图片描述

  桥接模式的核心意图就是把这些实现独立出来,让他们各自变化,这样每种实现的变化都不会影响其他实现,从而达到应对变化的目的

在这里插入图片描述

#include <iostream>
#include <string>

using namespace std;

// 手机软件类
class HandsetSoft
{
public:
    virtual void Run() = 0;
};

// 手机游戏
class HandsetGame : public HandsetSoft
{
public:
    void Run() override
    {
        cout << "运行手机游戏" << endl;
    }
};

// 手机通讯录
class HandsetAddressList : public HandsetSoft
{
public:
    void Run() override
    {
        cout << "运行手机通讯录" << endl;
    }
};

// 手机品牌类
class HandsetBrand
{
public:
    // 设置手机软件
    void SetHandsetSoft(HandsetSoft *soft)
    {
        this->soft = soft;
    }

    // 运行手机软件
    virtual void Run() = 0;

protected:
    HandsetSoft *soft;
};

// 两个具体的品牌类
class HandsetBrandM : public HandsetBrand
{
public:
    void Run() override
    {
        soft->Run();
    }
};

class HandsetBrandN : public HandsetBrand
{
public:
    void Run() override
    {
        soft->Run();
    }
};

// 客户端代码
void Client()
{
    HandsetBrand *ab;
    ab = new HandsetBrandN();

    ab->SetHandsetSoft(new HandsetGame());
    ab->Run();

    ab->SetHandsetSoft(new HandsetAddressList());
    ab->Run();

    ab = new HandsetBrandM();

    ab->SetHandsetSoft(new HandsetGame());
    ab->Run();

    ab->SetHandsetSoft(new HandsetAddressList());
    ab->Run();
}

int main()
{
    Client();

    return 0;
}

  这个过程就像是拿到一台新手机,给它装各种软件一样。
  实现手机品牌与手机软件的解耦,这样我们可以方便地增减手机品牌,也可以方便地增减手机的功能。

相关推荐

  1. 设计模式

    2024-06-19 07:32:04       23 阅读
  2. 设计模式模式

    2024-06-19 07:32:04       32 阅读
  3. 设计模式——模式

    2024-06-19 07:32:04       33 阅读
  4. 设计模式-模式

    2024-06-19 07:32:04       31 阅读
  5. 设计模式-模式

    2024-06-19 07:32:04       32 阅读
  6. 设计模式模式

    2024-06-19 07:32:04       14 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-19 07:32:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-19 07:32:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-19 07:32:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-19 07:32:04       18 阅读

热门阅读

  1. 【C++11】initializer_list详解!

    2024-06-19 07:32:04       8 阅读
  2. QT day4

    QT day4

    2024-06-19 07:32:04      7 阅读
  3. 百度网盘提速攻略:解决限速问题的实用方法

    2024-06-19 07:32:04       10 阅读
  4. vue项目cnpm i 报错

    2024-06-19 07:32:04       6 阅读
  5. 基于springboot的美食推荐商城源码数据库

    2024-06-19 07:32:04       7 阅读
  6. 【HarmonyOS NEXT 】鸿蒙generateBarcode (码图生成)

    2024-06-19 07:32:04       7 阅读
  7. 界面美观的测试报告

    2024-06-19 07:32:04       6 阅读
  8. JWT详解、JWTUtil工具类的构建方法

    2024-06-19 07:32:04       8 阅读
  9. bashrc和profile区别

    2024-06-19 07:32:04       6 阅读
  10. 下载工程resources目录下的模板excel文件

    2024-06-19 07:32:04       8 阅读
  11. 架构设计 - Nginx Proxy Cache 缓存配置

    2024-06-19 07:32:04       5 阅读
  12. 认识QML

    2024-06-19 07:32:04       5 阅读
  13. CSS 修改鼠标图标样式

    2024-06-19 07:32:04       5 阅读