用 C++ 跟你聊聊“桥接模式” | 原力计划

2020 年 5 月 30 日 CSDN

作者 | 看,未来
责编 | 夕颜
出品 | CSDN博客

桥接模式,号称设计模式中最抽象的一个,不是吹出来的啊。且看我能不能讲清楚啊。


这时候就体现出小故事的重要性了,这也是我为什么每篇设计模式都要先讲个小故事,便于理解记忆嘛。


手机配置的小故事


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


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


原始构造


文字不明显,我们看图:

现在我们以手机品牌为抽象基类,每个品牌的手机底下都要求实现:我能打游戏、我能打电话、我能在线撩妹、我能听音乐等功能,于是形成上面这个图。


且不说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;}


应用场景


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


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


版权声明:本文为CSDN博主「看,未来」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。


原文链接:

https://blog.csdn.net/qq_43762191/java/article/details/106187686


【END】
6月2日20:00 ,CSDN 创始人&董事长、极客帮创投创始合伙人蒋涛携手全球顶级开源基金会主席、董事,聚焦中国开源现状,直面开发者在开源技术、商业上的难题,你绝不可错过的开源巅峰对谈!立即免费围观

更多精彩推荐

重磅!阿里巴巴开源首个边缘计算云原生项目 OpenYurt

微信回应 WeTool 被封事件;支付宝小程序开放直播功能;Raspberry Pi 4 发布 8GB 版本| 极客头条

都无代码了,还要程序员吗?

附代码 | OpenCV实现银行卡号识别,字符识别算法你知多少?

因为一个跨域请求,我差点丢了饭碗

区块链的 Layer 2 扩容(Scaling)是否兑现了其承诺?

你点的每个“在看”,我都认真当成了喜欢
登录查看更多
0

相关内容

【ACL2020】多模态信息抽取,365页ppt
专知会员服务
144+阅读 · 2020年7月6日
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
192+阅读 · 2020年6月29日
少标签数据学习,54页ppt
专知会员服务
197+阅读 · 2020年5月22日
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
69+阅读 · 2020年1月17日
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
87+阅读 · 2019年11月25日
转岗产品经理,花了3个月都做不好需求工作
人人都是产品经理
10+阅读 · 2019年9月16日
从零开始一起学习SLAM | 掌握g2o边的代码套路
计算机视觉life
5+阅读 · 2019年3月6日
说说我的老同事,前端大神程劭非
余晟以为
17+阅读 · 2019年1月14日
逆向 | C++ 加壳程序的编写思路
计算机与网络安全
9+阅读 · 2019年1月1日
【APS】PCB企业如何实现APS自动排程系统
产业智能官
12+阅读 · 2018年9月24日
数学思维与编程思维怎样可以完美的结合
算法与数学之美
6+阅读 · 2018年6月11日
刚开始学编程?这几款小工具能让你事半功倍
Python 杠上 Java、C/C++,赢面有几成?
CSDN
6+阅读 · 2018年4月12日
PyTorch 到底好用在哪里?
AI研习社
3+阅读 · 2017年10月27日
文本聚类:从非结构化数据快速获取见解
Datartisan数据工匠
15+阅读 · 2017年10月12日
Arxiv
35+阅读 · 2019年11月7日
Arxiv
13+阅读 · 2019年1月26日
Arxiv
151+阅读 · 2017年8月1日
VIP会员
相关资讯
转岗产品经理,花了3个月都做不好需求工作
人人都是产品经理
10+阅读 · 2019年9月16日
从零开始一起学习SLAM | 掌握g2o边的代码套路
计算机视觉life
5+阅读 · 2019年3月6日
说说我的老同事,前端大神程劭非
余晟以为
17+阅读 · 2019年1月14日
逆向 | C++ 加壳程序的编写思路
计算机与网络安全
9+阅读 · 2019年1月1日
【APS】PCB企业如何实现APS自动排程系统
产业智能官
12+阅读 · 2018年9月24日
数学思维与编程思维怎样可以完美的结合
算法与数学之美
6+阅读 · 2018年6月11日
刚开始学编程?这几款小工具能让你事半功倍
Python 杠上 Java、C/C++,赢面有几成?
CSDN
6+阅读 · 2018年4月12日
PyTorch 到底好用在哪里?
AI研习社
3+阅读 · 2017年10月27日
文本聚类:从非结构化数据快速获取见解
Datartisan数据工匠
15+阅读 · 2017年10月12日
Top
微信扫码咨询专知VIP会员