设计模式(16)-Bridge.doc
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《设计模式(16)-Bridge.doc》由会员分享,可在线阅读,更多相关《设计模式(16)-Bridge.doc(13页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、一、 桥梁(Bridge)模式桥梁模式是一个非常有用的模式,也是比较复杂的一个模式(注:Java与模式一书认为Bridge模式不是一个使用频率很高的模式,我不太赞同,我认为Bridge模式中蕴涵了很多设计模式的关键思想在里面,所以我这里采纳了Design Patterns Explained一书的作者Alan Shalloway与James R. Trott的观点:The Bridge pattern is quite a bit more complex than the other patterns you just learned; it is also much more useful
2、)。熟悉这个模式对于理解面向对象的设计原则,包括“开闭”原则(OCP)以及组合/聚合复用原则(CARP)都很有帮助。理解好这两个原则,有助于形成正确的设计思想和培养良好的设计风格。桥梁模式的用意【GOF95】在提出桥梁模式的时候指出,桥梁模式的用意是“将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化”。这句话有三个关键词,也就是抽象化、实现化和脱耦。抽象化存在于多个实体中的共同的概念性联系,就是抽象化。作为一个过程,抽象化就是忽略一些信息,从而把不同的实体当做同样的实体对待【LISKOV94】。实现化抽象化给出的具体实现,就是实现化。脱耦所
3、谓耦合,就是两个实体的行为的某种强关联。而将它们的强关联去掉,就是耦合的解脱,或称脱耦。在这里,脱耦是指将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联。将两个角色之间的继承关系改为聚合关系,就是将它们之间的强关联改换成为弱关联。因此,桥梁模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以相对独立地变化。这就是桥梁模式的用意。二、 桥梁模式的结构桥梁模式【GOF95】是对象的结构模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。下图所示就是一个实现了桥梁模式的示意性系统的结构图
4、。可以看出,这个系统含有两个等级结构,也就是:l 由抽象化角色和修正抽象化角色组成的抽象化等级结构。l 由实现化角色和两个具体实现化角色所组成的实现化等级结构。桥梁模式所涉及的角色有:l 抽象化(Abstraction)角色:抽象化给出的定义,并保存一个对实现化对象的引用。l 修正抽象化(Refined Abstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义。l 实现化(Implementor)角色:这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象
5、化角色应当只给出基于底层操作的更高一层的操作。l 具体实现化(Concrete Implementor)角色:这个角色给出实现化角色接口的具体实现。三、 桥梁模式的示意性源代码/ Bridge pattern - Structural example using System;/ Abstractionclass Abstraction / Fields protected Implementor implementor; / Properties public Implementor Implementor set implementor = value; / Methods virtual
6、 public void Operation() implementor.Operation(); / Implementorabstract class Implementor / Methods abstract public void Operation();/ RefinedAbstractionclass RefinedAbstraction : Abstraction / Methods override public void Operation() implementor.Operation(); / ConcreteImplementorAclass ConcreteImpl
7、ementorA : Implementor / Methods override public void Operation() Console.WriteLine(ConcreteImplementorA Operation); / ConcreteImplementorBclass ConcreteImplementorB : Implementor / Methods override public void Operation() Console.WriteLine(ConcreteImplementorB Operation); / / Client test/ public cl
8、ass Client public static void Main( string args ) Abstraction abstraction = new RefinedAbstraction(); / Set implementation and call abstraction.Implementor = new ConcreteImplementorA(); abstraction.Operation(); / Change implemention and call abstraction.Implementor = new ConcreteImplementorB(); abst
9、raction.Operation(); 四、 调制解调器问题感觉敏捷软件开发原则、模式与实践中关于Bridge模式的例子很好。(Java与模式一书33章的对变化的封装一节也写得很不错,推荐大家读一读。它深入的阐述了Design Patterns Explained一书中“1)Design to interfaces. 2)Favor composition over inheritance. 3)Find what varies and encapsulate it”的三个观点。)。如图所示,有大量的调制解调器客户程序在使用Modem接口。Modem接口被几个派生类HayesModem、US
10、RoboticsModem和EarniesModem实现。它很好地遵循了OCP、LSP和DIP。当增加新种类的调制解调器时,调制解调器的客户程序不会受影响。假定这种情形持续了几年,并有许多调制解调器的客户程序都在使用着Modem接口。现出现了一种不拨号的调制解调器,被称为专用调制解调器。它们位于一条专用连接的两端。有几个新应用程序使用这些专用调制解调器,它们无需拨号。我们称这些使用者为DedUser。但是,客户希望当前所有的调制解调器客户程序都可以使用这些专用调制解调器。他们不希望去更改许许多多的调制解调器客户应用程序,所以完全可以让这些调制解调器客户程序去拨一些假(dummy)电话号码。如果
11、能选择的话,我们会把系统的设计更改为下图所示的那样。我们把拨号和通信功能分离为两个不同的接口。原来的调制解调器实现这两个接口,而调制解调器客户程序使用这两个接口。DedUser只使用Modem接口,而DedicateModem只实现Modem接口。但这样做会要求我们更改所有的调制解调器客户程序这是客户不允许的。一个可能的解决方案是让DedicatedModem从Modem派生并且把dial方法和hangup方法实现为空,就像下面这样:几个月后,已经有了大量的DedUser,此时客户提出了一个新的更改。为了能拨国际电话号码、信用卡电话、PIN标识电话等等,必修对现有dial中使用char10存储
12、号码改为能够拨打任意长度的电话号码。显然,所有的调制解调器客户程序都必须更改。客户同意了对调制解调器客户程序的更改,因为他们别无选择。糟糕的是,现在必须要去告诉DedUser的编写者,他们必须要更改他们的代码!你可以想象他们听到这个会有多高兴。本来他们是不用调用dial的。这就是许多项目都会具有的那种有害的混乱依赖关系。系统某一部分中的一个杂凑体(kludge)创建了一个有害的依赖关系,最终导致系统中完全无关的部分出现问题。如果使用ADAPTER模式解决最初的问题的话,就可以避免这个严重问题。如图:请注意,杂凑体仍然存在。适配器仍然要模拟连接状态。然而,所有的依赖关系都是从适配器发起的。杂凑体
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 设计 模式 16 Bridge
![提示](https://www.deliwenku.com/images/bang_tan.gif)
限制150内