动机(Motivate):

在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?意图(Intent):将抽象部分与实现部分分离,使它们都可以独立的变化。

------《设计模式》GOF

结构图(Struct):

生活中的例子:

我想大家小时候都有用蜡笔画画的经历吧。红红绿绿的蜡笔一大盒,根据想象描绘出格式图样。而毛笔下的国画更是工笔写意,各展风采。而今天我们的故事从蜡笔与毛笔说起。

想要绘制一幅图画,蓝天、白云、绿树、小鸟,如果画面尺寸很大,那么用蜡笔绘制就会遇到点麻烦。毕竟细细的蜡笔要涂出一片蓝天,是有些麻烦。如果有可能,

最好有套大号蜡笔,粗粗的蜡笔很快能涂抹完成。至于色彩吗,最好每种颜色来支粗的,除了蓝天还有绿地呢。这样,如果一套12种颜色的蜡笔,我们需要两套

24支,同种颜色的一粗一细。呵呵,画还没画,开始做梦了:要是再有一套中号蜡笔就更好了,这样,不多不少总共36支蜡笔。

再看看毛笔这一边,居然如此简陋:一套水彩12色,外加大中小三支毛笔。你可别小瞧这"简陋"的组合,画蓝天用大毛笔,画小鸟用小毛笔,各具特色。

呵呵,您是不是已经看出来了,不错,我今天要说的就是Bridge模式。为了一幅画,我们需要准备36支型号不同的蜡笔,而改用毛笔三支就够了,当

然还要搭配上12种颜料。通过Bridge模式,我们把乘法运算3×12=36改为了加法运算3+12=15,这一改进可不小。那么我们这里蜡笔和毛笔到

底有什么区别呢?

实际上,蜡笔和毛笔的关键一个区别就在于笔和颜色是否能够分离。【GOF95】桥梁模式的用意是"将抽象化

(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化"。关键就在于能否脱耦。蜡笔的颜色和蜡笔本身是分不

开的,所以就造成必须使用36支色彩、大小各异的蜡笔来绘制图画。而毛笔与颜料能够很好的脱耦,各自独立变化,便简化了操作。在这里,抽象层面的概念是:

"毛笔用颜料作画",而在实现时,毛笔有大中小三号,颜料有红绿蓝等12种,于是便可出现3×12种组合。每个参与者(毛笔与颜料)都可以在自己的自由度

上随意转换。

蜡笔由于无法将笔与颜色分离,造成笔与颜色两个自由度无法单独变化,使得只有创建36种对象才能完成任务。Bridge模式将继承关系转换为组合关系,从而降低了系统间的耦合,减少了代码编写量。代码实现:

1 abstractclassBrush2 {3 protectedColor c;4 publicabstractvoidPaint();5 6 publicvoidSetColor(Color c)7 {this.c=c; }8 }

1 classBigBrush : Brush2 {3 publicoverridevoidPaint()4 { Console.WriteLine("Using big brush and color {0} painting", c.color); }5 }

1 classSmallBrush : Brush2 {3 publicoverridevoidPaint()4 { Console.WriteLine("Using small brush and color {0} painting", c.color); }5 }

1 classColor2 {3 publicstringcolor;4 }

1 classRed : Color2 {3 publicRed()4 {this.color="red"; }5 }

1 classGreen : Color2 {3 publicGreen()4 {this.color="green"; }5 }

1 classBlue : Color2 {3 publicBlue()4 {this.color="blue"; }5 }

1 classProgram2 {3 publicstaticvoidMain()4 {5 Brush b=newBigBrush();6 b.SetColor(newRed());7 b.Paint();8 b.SetColor(newBlue());9 b.Paint();10 b.SetColor(newGreen());11 b.Paint();12 13 b=newSmallBrush();14 b.SetColor(newRed());15 b.Paint();16 b.SetColor(newBlue());17 b.Paint();18 b.SetColor(newGreen());19 b.Paint();20 }

适用性:

1.如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。

2.设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。

3.一个构件有多于一个的抽象化角色和实现化角色,系统需要它们之间进行动态耦合。

4.虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。Bridge要点:

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

2.所谓抽象和实现沿着各自维度的变化,即“子类化”它们,得到各个子类之后,便可以任意它们,从而获得不同平台上的不同型号。

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

4.Bridge模式的应用一般在“两个非常强的变化维度”,有时候即使有两个变化的维度,但是某个方向的变化维度并不剧烈——换言之两个变化不会导致纵横交错的结果,并不一定要使用Bridge模式。

mysql桥梁模式_桥接模式(Bridge Pattern)相关推荐

  1. Bridge模式(桥接模式)

    模式简介 桥接模式用于将抽象与实现相分离,二者的变化相互独立互不影响. 模式UML图 代码示例(C#) 提示:可在本栏目的资源篇"设计模式代码示例合集"下载所有完整代码资源. // ...

  2. 【设计模式学习笔记】组合模式与桥接模式案例详解(C++实现)

    目录 一.组合模式 1. 什么是组合模式 2. 组合模式案例 二.桥接模式 1. 什么是桥接模式 2. 桥接模式案例 一.组合模式 1. 什么是组合模式 Composite Pattern,组合模式, ...

  3. OpenWrt的两种模式:桥接模式与路由模式

    OpenWrt的两种模式:桥接模式与路由模式 1.桥接模式(Bridged AP Mode ): 通过OpenWrt 设备做桥,连接到OpenWrt的无线设备是由此网段192.168.1.0网段中的路 ...

  4. 设计模式自学笔记007_Real(命令模式、备忘录模式、桥接模式)

    设计模式自学笔记007_Real(命令模式.备忘录模式.桥接模式) 一.命令模式 在软件设计的过程中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道请求的操作是哪个.我们只需要 ...

  5. VMware虚拟网络设置(NAT模式,桥接模式,仅主机模式设置),再也不用担心虚拟机连不上网了。

    前言: 在使用VMware安装Linux之前需要配置网络相关设置,不然安装成功了也无法联网,VMware 给我们提供了3种模式,NAT模式,桥接模式,仅主机模式.接下来就是怎么设置这些网络. 1.VM ...

  6. 虚拟机网络连接模式中桥接模式和NAT模式的区别

    1.桥接模式:当虚拟机系统的网络连接模式为桥接模式时,相当于在主机系统和虚拟机系统之间连接了一个网桥,而网桥两端的网络都属于同一网络,主机和虚拟机是处于同一网络中的对等主机. 实例,在使用Xshell ...

  7. 装饰者模式---装饰者模式和桥接模式的区别

    装饰者模式: 什么是装饰者模式:动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案. 装饰者模式又称为包装模式,它主要是为了扩展对象的功能,包装类通过持有对象的引用(将对象传到 ...

  8. 转:中国移动宽带光猫F663路由模式改桥接模式

    转:中国移动光猫F623路由模式改桥接模式(拨号模式) 添加时间:2017-12-1  来源:http://www.637641.com/news.asp?id=285 注意:大家一定要记住自己的vl ...

  9. 【虚拟机NAT模式及桥接模式配置】

    VMware虚拟机网络配置 虚拟机常见的网络类型 NAT(网络地址转换) Bridged(桥接模式) Host-Only(仅主机) 虚拟机网络配置 配置为NAT模式 配置为桥接模式 虚拟机常见的网络类 ...

最新文章

  1. PyTorch 训练可视化教程 visdom
  2. js自定义类,混合的构造函数/原型方式
  3. 六级单词pdf_雅思提高词汇量是背单词还是大量刷题
  4. elasticsearch集群配置文件详述
  5. 操作系统识别-python、nmap
  6. DESIGN_OUTLINE' and 'CUTOUT' are the preferred subclasWARNING
  7. 程序员应该如何提问?
  8. (转载)控制反转(IoC)与依赖注入(DI)
  9. 收到计算机工程与应用的退修通知,《计算机工程与应用》退修意见
  10. 不要低估AI面临的困境
  11. Android SurfaceFlinger vsync信号产生与分发
  12. openresty查看log
  13. android 程序界面美化,Android ROM定制——界面美化基础(framework-res、SystemUI修改)...
  14. python职业发展规划-少走弯路,一个老程序猿谈PHP职业发展规划
  15. JDBC快速入门完全傻瓜式连接数据库
  16. 记一次刷路由器固件的经历
  17. 计算机基础与应用演示文稿教案,计算机应用基础讲解教案powerpoint演示文稿.ppt...
  18. 知犀思维导图,在线免费创作思维导图
  19. 【数据结构】二叉树遍历
  20. 平阳县抖音平台直播运营主播带货第三期培训提升班开班啦!

热门文章

  1. 爱奇艺视频下载后怎么转换为3gp格式
  2. 英特尔网卡更新firmware方法
  3. android.content.res.Resources$NotFoundException Resource ID #0xfffffe6c
  4. So Cool LINUX 3D桌面
  5. QT写小游戏详细教程
  6. python爬取b站数据_如果利用Python爬取B站上千万数据?B站直播都是大屌萌妹吗?...
  7. x98 3G安装debian
  8. 信息学奥赛一本通 1157:哥德巴赫猜想
  9. 四川大学计算机技术学院周群彪,周群-四川大学电气工程学院
  10. 盘点2010年IT业界十大囧事 iPhone居首