设计模式——Bridge 桥模式

文章目录

    • 1.动机
    • 2.定义
    • 3.代码
    • 4.总结

1.动机

由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度,乃至多个纬度的变化。

如何应对这种“多维度的变化”?
如何利用面向对象技术来使得类型可以轻松地沿着两个乃至多个方向变化,而不引入额外的复杂度?

2.定义

将抽象部分(业务功能)与实现部分(平台实现)分离,使它们都可以独立地变化。

3.代码

未使用桥模式

class Messager{
public:virtual void Login(string username, string password)=0;virtual void SendMessage(string message)=0;virtual void SendPicture(Image image)=0;virtual void PlaySound()=0;virtual void DrawShape()=0;virtual void WriteText()=0;virtual void Connect()=0;virtual ~Messager(){}
};//平台实现class PCMessagerBase : public Messager{
public:virtual void PlaySound(){//**********}virtual void DrawShape(){//**********}virtual void WriteText(){//**********}virtual void Connect(){//**********}
};class MobileMessagerBase : public Messager{
public:virtual void PlaySound(){//==========}virtual void DrawShape(){//==========}virtual void WriteText(){//==========}virtual void Connect(){//==========}
};//业务抽象class PCMessagerLite : public PCMessagerBase {
public:virtual void Login(string username, string password){PCMessagerBase::Connect();//........}virtual void SendMessage(string message){PCMessagerBase::WriteText();//........}virtual void SendPicture(Image image){PCMessagerBase::DrawShape();//........}
};class PCMessagerPerfect : public PCMessagerBase {
public:virtual void Login(string username, string password){PCMessagerBase::PlaySound();//********PCMessagerBase::Connect();//........}virtual void SendMessage(string message){PCMessagerBase::PlaySound();//********PCMessagerBase::WriteText();//........}virtual void SendPicture(Image image){PCMessagerBase::PlaySound();//********PCMessagerBase::DrawShape();//........}
};class MobileMessagerLite : public MobileMessagerBase {
public:virtual void Login(string username, string password){MobileMessagerBase::Connect();//........}virtual void SendMessage(string message){MobileMessagerBase::WriteText();//........}virtual void SendPicture(Image image){MobileMessagerBase::DrawShape();//........}
};class MobileMessagerPerfect : public MobileMessagerBase {
public:virtual void Login(string username, string password){MobileMessagerBase::PlaySound();//********MobileMessagerBase::Connect();//........}virtual void SendMessage(string message){MobileMessagerBase::PlaySound();//********MobileMessagerBase::WriteText();//........}virtual void SendPicture(Image image){MobileMessagerBase::PlaySound();//********MobileMessagerBase::DrawShape();//........}
};void Process(){//编译时装配Messager *m =new MobileMessagerPerfect();
}

使用桥模式

class Messager{
protected:MessagerImp* messagerImp;//...
public:virtual void Login(string username, string password)=0;virtual void SendMessage(string message)=0;virtual void SendPicture(Image image)=0;virtual ~Messager(){}
};class MessagerImp{
public:virtual void PlaySound()=0;virtual void DrawShape()=0;virtual void WriteText()=0;virtual void Connect()=0;virtual MessagerImp(){}
};//平台实现 n
class PCMessagerImp : public MessagerImp{
public:virtual void PlaySound(){//**********}virtual void DrawShape(){//**********}virtual void WriteText(){//**********}virtual void Connect(){//**********}
};class MobileMessagerImp : public MessagerImp{
public:virtual void PlaySound(){//==========}virtual void DrawShape(){//==========}virtual void WriteText(){//==========}virtual void Connect(){//==========}
};//业务抽象 m//类的数目:1+n+mclass MessagerLite :public Messager {public:virtual void Login(string username, string password){messagerImp->Connect();//........}virtual void SendMessage(string message){messagerImp->WriteText();//........}virtual void SendPicture(Image image){messagerImp->DrawShape();//........}
};class MessagerPerfect  :public Messager {public:virtual void Login(string username, string password){messagerImp->PlaySound();//********messagerImp->Connect();//........}virtual void SendMessage(string message){messagerImp->PlaySound();//********messagerImp->WriteText();//........}virtual void SendPicture(Image image){messagerImp->PlaySound();//********messagerImp->DrawShape();//........}
};void Process(){//运行时装配MessagerImp* mImp=new PCMessagerImp();Messager *m =new Messager(mImp);
}

4.总结

Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固 有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。所谓抽象和实现沿着各自纬度的变化,即“子类化”它们。

Bridge模式有时候类似于多继承方案,但是多继承方案往往违背 单一职责原则(即一个类只有一个变化的原因),复用性比较差。

Bridge模式是比多继承方案更好的解决方法。

Bridge模式的应用一般在“两个非常强的变化维度”,有时一个 类也有多于两个的变化维度,这时可以使用Bridge的扩展模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/483099.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2022年六大值得关注的边缘计算趋势

来源: 边缘计算社区关于边缘计算的许多方面并不新鲜,但它仍在快速发展。例如,“边缘计算”包括已经存在了几十年的分布式零售商店分支系统。这个术语也包含了当地工厂和电信提供商计算系统的各种形式,尽管这是一种比历史规范更紧密…

RateLimiter的 SmoothBursty(非warmup预热)及SmoothWarmingUp(预热,冷启动)

SmoothBursty 主要思想 记录 1秒内的微秒数/permitsPerSencond 时间间隔interval,每一个interval可获得一个令牌 根据允许使用多少秒内的令牌参数,计算出maxPermits setRate时初始化下次interval时间,及storedPermits acquire时,计算当前now…

C++学习——引用和指针

文章目录1. 引用和指针的区别&#xff1f;2. C中的指针参数传递和引用参数传递1. 引用和指针的区别&#xff1f; 指针是一个实体&#xff0c;需要分配内存空间。引用只是变量的别名&#xff0c;不需要分配内存空间。 #include<iostream> using namespace std;class sol…

未来已来:全球XR产业洞察

来源&#xff1a;德勤Deloitte编辑&#xff1a;蒲蒲近日&#xff0c;德勤中国科技、传媒和电信行业推出元宇宙系列报告《元宇宙系列白皮书—未来已来&#xff1a;全球XR产业洞察》&#xff0c;聚焦XR产业发展趋势。报告指出&#xff0c;多元融合是元宇宙的演变趋势。在元宇宙发…

C++学习——static

文章目录1. static的用法和作用&#xff1f;2.静态变量什么时候初始化1. static的用法和作用&#xff1f; 1.先来介绍它的第一条也是最重要的一条&#xff1a;隐藏。&#xff08;static函数&#xff0c;static变量均可&#xff09; 当同时编译多个文件时&#xff0c;所有未加…

谷歌、哈佛联手绘出「百万分之一」人脑神经3D连接图!天量数据竟可塞满14亿块1T硬盘...

来源&#xff1a;神经科技编辑&#xff1a;Yezi审阅&#xff1a;mingzlee7前不久&#xff0c;谷歌和哈佛大学联手发布人脑神经3D连接图&#xff0c;涵盖人脑一百万分之一的信息&#xff0c;但数据已经塞满了1400块1T硬盘&#xff01;现在&#xff0c;这个研究团队表示&#xff…

python replace()

转载于:https://www.cnblogs.com/JackFang-X/p/11090449.html

C++学习——const

文章目录1.const的作用2.const成员函数的理解和应用&#xff1f;1.const的作用 1. 阻止一个变量被改变&#xff0c;可以使用const关键字。在定义该const变量时&#xff0c;通常需要对它进行初始化&#xff0c;因为以后就没有机会再去改变它了&#xff1b; #include<iostre…

解决表单提交的数据丢失问题

解决表单提交的数据丢失问题&#xff1a; 一、问题描述&#xff1a; 当我们在给前台页面设置修改功能的时候&#xff0c;因为有些信息是不允许进行修改的&#xff0c;所以在修改表单中没有相应的修改输入框&#xff0c;但是在修改表单的数据提交的时候&#xff0c;那些不允许修…

科学家即将揭示人类大脑神经网络结构的奥秘

来源&#xff1a;今日头条人类即将迎来了解大脑神经网络结构神秘世界的曙光&#xff01;哈佛大学神经科学家和谷歌工程师&#xff0c;发布了第一张人类大脑部分的神经网络连接图&#xff0c;大约针头大小的人类大脑组织用重金属染色&#xff0c;切成 5,000&#xff0c;并在电子…

C++学习—— mutable和 extern

文章目录1. mutable2.extern用法&#xff1f;1. mutable 1) 如果需要在const成员方法中修改一个成员变量的值&#xff0c;那么需要将这个成员变量修饰为mutable。即用mutable修饰的成员变量不受const成员方法的限制; 常成员函数&#xff0c;不允许修改成员变量的值&#xff0c…

温故而知新,6位顶级CV科学家聚首:计算机视觉中的深度学习方法vs传统方法...

来源&#xff1a;AI科技评论作者&#xff1a;Mr Bear编辑&#xff1a;青暮2021 年 10 月 13 日&#xff0c;来自麻省理工学院、加州大学伯克利分校、伊利诺伊大学香槟分校、华盛顿大学、帝国理工学院的六名顶级人工智能科学家、计算机视觉科学家在 ICCV 2021 大会期间进行了题为…

20190626_二次开发BarTender打印机_C#代码_一边读取TID_一边打印_打印机POSTEK

demo代码如下: private void btnPrint_Click(object sender, EventArgs e){if (this.btnPrint.Text "停止打印"){SetBtnPrintUIEnable();return;}//禁用界面上的相关按钮SetBtnPrintUIDisable();var dt new DataTable(); new Task(() >{///开始的打印//1. 获取…

C++学习——string

文章目录1.int转字符串字符串转int?2.strcat,strcpy,strncpy,memset,memcpy的内部实现&#xff1f;1.int转字符串字符串转int? 例:"123"123#include<iostream> #include<string> using namespace std;string string_head_end(string str) {string s&q…

卷积神经网络(CNN)数学原理解析

来源&#xff1a;图灵人工智能作者&#xff1a;Piotr Skalski编辑&#xff1a;python数据科学原标题&#xff1a;Gentle Dive into Math Behind Convolutional Neural Networks翻 译&#xff1a; 通夜&#xff08;中山大学&#xff09;、had_in&#xff08;电子科技大学&#…

仅模糊背景图像而不是前面的文本

正如标题所说。 如何模糊容器的背景图像而不模糊前面的文本&#xff1f; <div class"card"> <div class"head"> <div class"title"> <span>Card Title</span> </div> </div> <div class"body…

C++学习——模板

文章目录1.C模板2.C模板是什么&#xff0c;底层怎么实现的&#xff1f;1.C模板 模板是泛型编程的基础&#xff0c;泛型编程即以一种独立于任何特定类型的方式编写代码。模板是创建泛型类或函数的蓝图或公式。 库容器&#xff0c;比如迭代器和算法&#xff0c;都是泛型编程的例…

【数据结构基础】-串-顺序结构的基本操作实现

2019.10.12 数据结构中串的基本操作实现&#xff0c;包括串的定义&#xff0c;串的初始化&#xff0c;赋值&#xff0c;获取串的长度&#xff0c;串的比较&#xff0c;连接串&#xff0c;求子串&#xff0c;清空串。 语言&#xff1a;c语言 运行环境&#xff1a;dev #include &…

大脑研究正在挑战超级计算,“人脑计划”或需提前部署百亿亿级超级计算机...

来源&#xff1a;DeepTech深科技人脑的复杂性正推动着超级计算释放更多的潜力。据了解&#xff0c;人脑包含大约 860 亿个神经元&#xff0c;可形成数万亿个接触点。如果以细胞分辨率对整个大脑进行成像&#xff0c;甚至会产生数 PB 范围内的数据&#xff0c;这样的的计算量令人…

02 算术、字符串与变量(1)

本章内容 1、交互式命令shell 2、整数算术 3、浮点算术 4、其他数学函数 5、字符串 6、字符串拼接 7、获取帮助 8、类型转换 9、变量和值 10、赋值语句 11、变量如何引用值 12、多重赋值 -------------------------------------- 在学习Python前&#xff0c;我们需要了解数据类…