文章目录

  • 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的扩展模式。

设计模式——Bridge 桥模式相关推荐

  1. java 设计模式学习笔记十 bridge桥模式

    bridge桥模式 将抽象和行为划分开来,各自独立但能动态结合 抽象的接口 /**  * 咖啡抽象类  *   * @time 下午09:14:27  * @author retacn yue  * ...

  2. java bridge 模式_Java设计模式之桥模式(Bridge模式)介绍

    Bridge定义:将抽象和行为划分开来,各自独立,但能动态的结合. 为什么使用桥模式 通常,当一个抽象类或接口有多个具体实现(concrete subclass),这些concrete之间关系可能有以 ...

  3. C++设计模式-Bridge桥接模式

    作用:将抽象部份与它的实现部份分离,使它们都可以独立地变化. 将抽象(Abstraction)与实现(Implementation)分离,使得二者可以独立地变化. 桥接模式号称设计模式中最难理解的模式 ...

  4. 中国移动光猫H2-3拨号模式和bridge(桥)模式

    光猫型号是:H2-3 个人评价: 这款光猫拨号模式有问题,宽带账号密码一改,怎么配都不行,拨不上号,最好一开始就配成bridge模式. 1.先上拨号模式,截图如下: 2.下面是bridge模式

  5. [php]php设计模式 Bridge (桥接模式)

    1 <?php 2 /** 3 * 桥接模式 4 * 5 * 将抽象部份与它实现部分分离,使用它们都可以有独立的变化 6 */ 7 abstractclass Implementor 8 { 9 ...

  6. 07Bridge(桥)模式

    技术交流QQ群:1027579432,欢迎你的加入! 1.Bridge(桥模式)动机 由于某些类型的固有实现逻辑,使得它们具有两个变化的维度,乃至多个维度的变化. 如何应对这种多维度的变化?,如何利用 ...

  7. 设计模式的理解:桥模式 Bridge

    当一种抽象有多种实现时通常用继承来实现他们.桥模式的设计和装饰模式 有一定的相似之处,都是通过组合来解决继承的滥用问题.现有一个需求,将一个项目分成普通用户版和VIP版,该项目要同时支持WINDOW1 ...

  8. 【Bridge模式】C++设计模式——桥模式

    桥模式 一.设计流程探讨 二.模式介绍 三.代码实现     C++设计模式大全,23种设计模式合集详解-

  9. Java设计模式——桥模式

    概述 桥模式(Bridge)是为了解决将抽象部分与实现部分分离,好让他们都在自己的维度上有多维度地变化.这句话是好理解的,只是我在学习完桥模式之后,存在一些疑问,还好现在想通了.现在我就桥模式的设计思 ...

最新文章

  1. php+ajax+jquery实现jsonp跨域
  2. 你的分区够用吗?来学lvm吧!
  3. git上传代码,合并代码,分支相关
  4. 小组会谈(2019.3.14)
  5. 一加10 Pro的性能配置还是非常不错的
  6. 硬盘功率测试软件,CPU功耗检测
  7. vim-airline use patched fonts
  8. 哥德巴赫猜想python
  9. 利用保利威视实现教育视频预览和购买
  10. 数据结构基础之基础(数据、计算机结构)
  11. Unirech腾讯云国际版代充-使用RDP文件登录到Windows云服务器实例教程
  12. Android中,长度单位详解(dp、sp、px、in、pt、mm)具体解释与换算(1)
  13. ArduPilot添加新的惯导方案
  14. iOS好用的第三方框架/插件
  15. 20世纪十大哲学问题
  16. 关于C#建立FLASH服务端的安全沙箱问题
  17. 数据结构之稀疏数组队列
  18. 吴恩达:回顾2021,这些大事件影响了AI这一年
  19. 企业级的HttpsNginx实战部署
  20. 【Python】Python系列教程-- Python3 编程第一步(十八)

热门文章

  1. LeetCode 911. 在线选举(二分查找)
  2. LeetCode 276. 栅栏涂色(DP)
  3. LeetCode 1318. 或运算的最小翻转次数(位运算)
  4. LeetCode 349. 两个数组的交集(哈希)
  5. java webservice 服务器_java如何写webservice服务端
  6. 微信小程序基础(一)
  7. Hive的数据加载与导出
  8. 数据还是模型?人类知识在深度学习里还有用武之地吗?
  9. 限定域文本语料的短语挖掘(Phrase Mining)
  10. Spring Cloud实战小贴士:turbine如何聚合设置了context-path的hystrix数据