用C++跟你聊聊“桥接模式”

简介:

在这里插入图片描述
桥接模式,号称设计模式中最抽象的一个,不是吹出来的啊。且看我能不能讲清楚啊。
这时候就体现出小故事的重要性了,这也是我为什么每篇设计模式都要先讲个小故事,便于理解记忆嘛。

@[toc]

手机配置的小故事

故事是别人的,网上一搜“桥接模式”,基本能看到这个故事。

手机品牌和软件是两个概念,不同的软件可以在不同的手机上,不同的手机可以有相同的软件,两者都具有很大的变动性。如果我们单独以手机品牌或手机软件为基类来进行继承扩展的话,无疑会使类的数目剧增并且耦合性很高。

原始构造

文字不明显,我们看图:
在这里插入图片描述

现在我们以手机品牌为抽象基类,每个品牌的手机底下都要求实现:我能打游戏、我能打电话、我能在线撩妹、我能听音乐等功能,于是形成上面这个图。
且不说M品牌手机和N品牌手机的功能重叠,就单说我现在要加一个功能,我能付钱,要加几个类?那我现在再加一个O品牌手机,要从哪儿入手,这个改动大不?
对上面这张类图的拓展,简直可以说是指数增长!!!
判处这个设计不及格,打回重构。

重构

前面已经暗示过了,每个品牌的手机,他们的功能都有互通点,比如都要能打电话、能上网、能拍照、能···不然基本卖不出去的。

那我们自然而然就可以联想到将这些功能抽象出来,在将这个抽象类聚合到品牌类下去,这样不就可以实现对功能与品牌的解耦嘛。

那,再看图:
在这里插入图片描述现在呢,要添加一个品牌,就添加呗,没人拦着你,添加品牌和手机软件并没有一毛钱关系,要添加一个软件,那就添加嘛,畅通无阻的事儿。手机软件下还要加子类怎么办?看情况,如果对子类的拓展情况不理想,可以考虑再独立出来一个抽象类。

合成/聚合原则

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

聚合表示一种弱的“拥有”关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样。

合成/复用原则的好处:有助于保持每个类被封装,并被集中在单个任务上。这样类和类继承层次会保持较小规模,并且不太可能增长为不可控的庞然大物。

桥接模式

在这里插入图片描述

抽象基类及接口:

1、Abstraction::Operation():定义要实现的操作接口

2、AbstractionImplement::Operation():实现抽象类Abstaction所定义操作的接口,由其具体派生类ConcreteImplemenA、ConcreteImplemenA或者其他派生类实现。

3、在Abstraction::Operation()中根据不同的指针多态调用AbstractionImplement::Operation()函数。

小故事代码实现

#include<iostream>

using namespace std;

//手机软件类 - 抽象基类
class softbase {
public:
    virtual void run() = 0;
};

//手机软件 - 实现类
class softmusic:public softbase{
public:
    void run() { cout << "Music!" << endl; }
};

class softgame :public softbase {
public:
    void run() { cout << "welcome to WangZheRongYao!" << endl; }
};


//手机品牌类 - 抽象基类
class brandbase {
protected:
    softbase* soft;
public:
    void setSoft(softbase* s) { this->soft = s; }
    virtual void run() = 0;
};

//手机品牌类 - 实现类
class brandM:public brandbase{
public:
    void run() { soft->run(); }
};

class brandN :public brandbase {
public:
    void run() { soft->run(); }
};

int main()
{
    //这里提供的是单功能添加,若要多功能,可以自己添加STL容器进来,或者看前一篇:备忘录模式
    brandbase* bm = new brandM();
    bm->setSoft(new softmusic());
    bm->run();
    bm->setSoft(new softgame());
    bm->run();

    brandbase* bn = new brandN();
    bn->setSoft(new softmusic());
    bn->run();
    bn->setSoft(new softgame());
    bn->run();


    return 0;
}

应用场景

==设计中有超过一维的变化我们就可以用桥模式。如果只有一维在变化,那么我们用继承就可以圆满的解决问题。==

如果有哪里讲的不清不楚,欢迎指正批评。

相关文章
|
7月前
|
设计模式 C++
设计模式之桥接模式(C++)
设计模式之桥接模式(C++)
|
2月前
|
设计模式 存储 API
C++桥接模式大解析:轻松设计与实现高效软件架构
C++桥接模式大解析:轻松设计与实现高效软件架构
163 0
|
7月前
|
设计模式 uml C++
[学习][笔记]设计模式(基于C/C++实现)<七>桥接模式
[学习][笔记]设计模式(基于C/C++实现)<七>桥接模式
|
设计模式 存储 C++
【设计模式学习笔记】组合模式与桥接模式案例详解(C++实现)
【设计模式学习笔记】组合模式与桥接模式案例详解(C++实现)
293 0
【设计模式学习笔记】组合模式与桥接模式案例详解(C++实现)
|
设计模式 uml C++
[学习][笔记]设计模式(基于C/C++实现)<七>桥接模式
设计模式(基于C/C++实现)<七>桥接模式
108 0
[学习][笔记]设计模式(基于C/C++实现)<七>桥接模式
|
C++
设计模式—桥接模式的C++实现
这是Bwar在2009年写的设计模式C++实现,代码均可编译可运行,一直存在自己的电脑里,曾经在团队技术分享中分享过,现搬到线上来。 1. 装饰模式简述 1.1 目的       将抽象部分与它的实现部分分离,使它们可以独立地变化。
1676 0
|
C++ uml 开发者
C++桥接模式
简述 桥接模式(Bridge Pattern)是将抽象部分与它的实现部分分离,使它们都可以独立地变化。 简述 模式结构 优缺点 适用场景 案例分析 代码实现 版权所有:一去丶二三里,转载请注明出处:http://blog.csdn.net/liang19890820 模式结构 UML 结构图: Abstraction(抽象类):用于定义抽象类的接口,并且维护一个指向 Implementor 实现类的指针。
1596 0
|
C++
c++涉及模式 桥接模式(bridge Pattern)
c++涉及模式 桥接模式(bridge Pattern) 考虑这样一个问题: 需要获得一个图形,这个图形可以是圆形,可以是正方形,可以使长方形其颜色可以是蓝色可以是红色可以是绿色,如果这种情况下将设计写死,那么可以 看到有3*3=9 个类,但是图形和颜色更多呢?...
1198 0
|
20小时前
|
编译器 C语言 C++
c++初阶------类和对象(六大默认构造函数的揭破)-3
c++初阶------类和对象(六大默认构造函数的揭破)