桥梁模式的结构与示意性源代码_第1页
桥梁模式的结构与示意性源代码_第2页
桥梁模式的结构与示意性源代码_第3页
桥梁模式的结构与示意性源代码_第4页
桥梁模式的结构与示意性源代码_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一、

桥梁(Bridge)模式桥梁模式是一个非常有用的模式,也是比较复杂的一个模式。熟悉这个模式对于理解面向对象的设计原则,包括"开-闭"原则(OCP)以及组合/聚合复用原则(CARP)都很有帮助。理解好这两个原则,有助于形成正确的设计思想和培养良好的设计风格。桥梁模式的用意【GOF95】在提出桥梁模式的时候指出,桥梁模式的用意是"将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化"。这句话有三个关键词,也就是抽象化、实现化和脱耦。抽象化存在于多个实体中的共同的概念性联系,就是抽象化。作为一个过程,抽象化就是忽略一些信息,从而把不同的实体当做同样的实体对待【LISKOV94】。实现化抽象化给出的具体实现,就是实现化。脱耦所谓耦合,就是两个实体的行为的某种强关联。而将它们的强关联去掉,就是耦合的解脱,或称脱耦。在这里,脱耦是指将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联。将两个角色之间的继承关系改为聚合关系,就是将它们之间的强关联改换成为弱关联。因此,桥梁模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以相对独立地变化。这就是桥梁模式的用意。二、

桥梁模式的结构桥梁模式【GOF95】是对象的结构模式,又称为柄体(HandleandBody)模式或接口(Interface)模式。下图所示就是一个实现了桥梁模式的示意性系统的结构图。给可以看出,僵这个系统含恋有两个等级烂结构,也就完是:湾由抽象化角帐色和修正抽薪象化角色组汗成的芦抽象化等级抄结构。毯由实现化角馒色和两个具点体实现化角语色所组成的桶实现化等级沫结构语。那桥梁模式所惰涉及的角色抵有:坦抽象化(A崖bstra司ction沙)角色:逐抽象化给出尿的定义,并造保存一个对股实现化对象为的引用。肾修正抽象化不(Refi铸nedA颜bstra添ction视)角色:心扩展抽象化害角色,改变屡和修正父类乒对抽懒象化的定义雁。午实现化(I绒mplem股entor摄)角色:砌这个角色给消出实现化角映色的接口,刑但不给出具膜体的实现。遵必须指出的宰是,这个接元口不一定和尘抽象化角色丽的接口定义哪相同,实际塑上,这两个钥接口可以非啊常不一样。国实现化角色冰应当只给出财底层操作,遇而抽象化角组色应当只给滋出基于底层提操作的更高拴一层的操作携。砌具体实现化遍(Con凳crete防Imp窝lemen稍tor)角庭色:裤这个角色给兴出实现化角风色接口的具钢体实现。塘三、

桥梁卸模式的示意份性源代码谨//

Br盛idge

球patte鼻rn

--涂

Stru些ctura堤l

exa糊mple

输哨usi状ng兼

Syst膏em;患//

"A荒bstra泥ction显"挪class笑

Abst纪racti给on鸭{该闷//

Fi支elds权栗prote存cted寒

Impl阔ement恳or

im寺pleme代ntor;贸砌/警/

Pro池perti票es柔向publi鼻c于

Impl室ement衬or

Im呆pleme孩ntor插乳{张矩set铺{

imp页lemen努tor

=喂

valu夹e;

}乖

}械碍//

Me航thods坏亭virtu桶al潜波publi丰c音如void匙

Oper乎ation谋()溪床{桂

i嗽mplem巾entor聋.Oper潮ation边();岁

}涉}事//

"I讨mplem道entor短"步abstr菜act站忧class贡

Impl勇ement渗or失{篮此//

Me生thods竭袭abstr狮act浊京publi级c辽拜void有

Oper即ation父();装}增//

"R白efine具dAbst稳racti挡on"瞒class哭

Refi肾nedAb唉strac狼tion

调:

Abs颗tract院ion模{炉筋//

Me档thods催妇overr拘ide泻督publi处c火韵void盈

Oper汉ation乱()械唯{厘

i贵mplem份entor园.Oper柔ation械();屯

}至}高//

"C没oncre尾teImp费lemen蝴torA"止class密

Conc浅reteI仗mpl侮ement栏orA

:锁

Impl好ement毙or联{麦可//

Me逃t棕hods肺扑overr归ide吴慎publi慎c绝扇void隶

Oper坡ation竞()宝楼{健

C棵onsol咬e.Wri镜teLin洪e("Co骂ncret迫eImpl稠ement垮orA

O箱perat衰ion")顷;优

}监}删//

"C朽oncre源teImp缸lemen催torB"醒class垒

Conc海reteI锹mplem刑entor佛B

:

I焰mplem比entor杯{歌寻//

Me知thods悉疏overr倒ide炎哑pub盒lic能梯void墨

Oper虽ation厕()升鞭{收

C盆ons庸ole.W旗riteL煌ine("桂Concr债eteIm梦pleme垂ntorB低

Oper哈ation五");兵

}麦}酒芬///挎蒜///芳

Clie思nt

te震st渣///摆新publi测c朵崭class奖并Clien乱t束{仆球publi问c招榜stati队c是讽void曲

Main陶(

拖strin柔g辆[]

ar怨gs

)熔瓶{奏

A论bstra错ction址

abst笼racti肤on

=

悠new各

Refi美nedAb屈strac最tion(泪);们猜//

Se快t

imp弓lemen稳tatio僵n

壤and

c僵all滩

a部bstra谣ction必.Impl浴ement捆or

=

秩new阶

Conc芝reteI易mplem库entor著A();赛

a你bstra挎ction锁.Oper奸ation决();防牛//竞

Chan另ge

im额pleme绪ntion杀

and

共call堪

a颈bstra睛ction挪.Impl模ement辩or

=

观new蛾

Conc叠reteI照mplem魔entor目B();夜

a蔽bstra届ction呢.Oper伸at科ion()灯;僵

}活}崇四、

调制般解调器问题膜感觉《敏捷唉软件开抹发-原则、考模式与宋实践》中关暮于Brid灶ge模式的颈例子很好。顺(《Jav擦a与模式》参一书33章种的对变化的精封装一节也梅写得很不错偷,推荐大家罢读一读。它处深入的阐述昨了《Des辰ignP败atter睬nsEx嘱plain去ed》一书裤中"1)D赵esign莫toi密nterf室aces.散2)Fa声vorc记ompos既ition衔over持inhe赛ritan嚷ce.3稻)Find送what凉vari暑esan杀denc递apsul镜atei砌t"的三个污观点。)。沉如图所愧示,有大量秀的调制解调子器客户程序脖在使地用Mode扛m接口。M严odem接追口被围几个派况生类H味ayesM妹odem、后USRob勇otics帽Modem葛和Ear也niesM店odem实码现。它很好邻地遵循了O父CP、LS岂P和DIP优。当增加新滨种类的调制常解调器时,冠调制解调器喉的客户程序凶不会受影响炼。秤假定这种情辅形持续了几敏年,并有许消多调制解调互器的客户程求序都在使用托着Mode峡m接口。现绍出现了一种螺不拨号的调馒制解调器,集被称为专用聪调制解调器敢。它们位于驴一条专用连滨接的两端。简有几个新应镜用程序使用话这些专用调捷制解调器,堡它们无需拨五号。我们称堆这些使用者幸为DedU箱ser。梦但是,客户扬希望当前所昂有的调制解骂调器激客户程序都虽可以使用这翅些专用调制叨解调块器。他腥们不希冠望去更改许骄许多多的调雀制解调器客店户应用程序馒,所以完全奏可以让这些拣调制解调器码客户程序去匹拨一些假砌(dumm叛y)号拐码。斯如果能选择少的话,我们足会把系统的染设计更改为少下图所示的丈那样。性我们把拨号激和通信功能缺分离为两个纱不同的接口窄。原来的调腥制解调器实豆现这两个接耀口,而调制诵解调器客户秒程序使用这悄两个接口。妥DedUs饭er只使用页Mode杜m接口,而悟Dedic傅ateMo视dem只实狠现Mode宿m接口。但信这样做会要拔求我们更改垄所有的调制死解调器客户耕程序--这航是客伪户不允许的品。台一个可能的资解决方案是赏让Dedi钉cated拥Modem套从Mode焰m派生并且亚把dial肆方法和ha猪ngup方辞法实现为空烘,就像下面筐这样:塞几个月后,凯已经有了大总量的Ded告User,躺此时客户提角出了一个新呆的更改。为葡了能拨国际贱号码、密信用卡跪、PIN标款识等等猪,必修对现界有dial点中使用ch孔ar[10游]存储号码秧改为能够拨得打任意长度刮的号码缴。轮显然,所有图的调制解调赠器客户程序巾都必须更改锯。客户同意由了对调制解旗调器客户程怨序的更改,屋因为他们别哄无选择。糟氏糕的是,现合在必须要去碎告诉Ded广User的细编写者,他肆们必须要更酬改之他们的代码醋!你可以想宫象他们听到刻这个洁会有多高兴艘。本来他们著是不用调用翁di汉al的掘。散这就是许多旗项目都会具古有的那种有逆害的混乱依龄赖关系。系蜘统某一部分丛中的一个杂皂凑体(kl初udge)扰创建了一个言有害的依赖近关系,最终霸导致系统中固完全无关的押部分出现问哥题。慕如果使用A汉DAPTE迫R模式解决堪最初的问题火的话,就可滨以避免这个夕严重问题。惊如图:尸请注意,杂烈凑体仍然存护在。适配器税仍然要模拟闭连接状态。党然而,所有梨的依赖关系倍都是从适配坑器发起的。罢杂凑体和系潜统隔离,藏魂身于几乎无膨人知晓的适棒配器中。逝BRIDG晓E模式妨看待这个问露题,还有另括外一个方式夫。现在,蚊出现了另外地一种切分M龙odem层哨次结第构的方式。抛如下图:氏这不是一个渴理想的招结构。每当波增加一章款新硬件时羊,就必须创银建两个新类每--一个针欧对专用的情犹况,一个针运对拨号的情眨况。每当增仅加一种新连萝接类型时,县就必须创建承3个新类,沃分别对应3扮款不同的硬拾件。如果这走两个自由度扶根本就是不桂稳定的,那纺么不用多久右,就会出现爆大量的派生压类。千在类型层次晕结构具有多眠个自由度的汽情况中,B资RIDGE般模式通常是付有用的。我君们可以把这潜些层次结构泊分开并通过踢桥把它们结次合到一起,裂而不是把它巨们合并起来揉。如图:暮我们把调制晌解调器类层绒次结构分成支两个层次结镜构。一个表回示纽连接方法,喇另一个表示吗硬件。恋这个结构虽辅然百复杂,但是激很有趣。它隆的创建不会科影响脾到调制解调后器的使用者打,并且还完短全分韵离了连接策化略和硬件实营现。Mo色demCo捷nnect护Contr冷oller骗的每个派生歇类代表了一驾个新的连接坝策略。在这无个策略的实鹊现中可以使冲用send外lmp、r漏eceiv中elmp、眼dial润lmp和h液anglm藏p。新im栽p方法的增隔加不会影响霉到使用者。备可以使用I迎SP来给连卫接控制类增若加新的接口毛。这种做法浴可以创建出并一条迁移路春径,调制解洗调器的客户界程序可以沿液着这条路径株慢慢地得到夜一个比di执al和ha汽ngup层汗次更高的A难PI取。烂五、

另外膀一个实际应厕用垄Bridg密e模式的例圆子冲该例子演示陷了业务对象链(伸Busin攻essOb逐j晴ect)通丹过Brid兴ge模式与落数据对象(谋DataO坟bject独)解耦。数俱据对象的实振现可以在不贱改变客户端标代码的情况失下动态进行恶更换。//

Bridge

pattern

--

Real

World

exampleusing

System;using

System.Collections;//

"Abstraction"class

BusinessObject{//

Fieldsprivate

DataObject

dataObject;protectedstring

group;//

Constructorspublic

BusinessObject(

string

group

){this.group

=

group;

}//

Propertiespublic

DataObject

DataObject{set{

dataObject

=

value;

}get{

return

dataObject;

}

}//

Methodsvirtualpublicvoid

Next(){

dataObject.NextRecord();

}virtualpublicvoid

Prior(){

dataObject.PriorRecord();

}virtualpublicvoid

New(

string

name

){

dataObject.NewRecord(

name

);

}virtualpublicvoid

Delete(

string

name

){

dataObject.DeleteRecord(

name

);

}virtualpublicvoid

Show(){

dataObject.ShowRecord();

}virtualpublicvoid

ShowAll(){

Console.WriteLine(

"Customer

Group:

{0}",

group

);

dataObject.ShowAllRecords();

}}//

"RefinedAbstraction"class

CustomersBusinessObject

:

BusinessObject{//

Constructorspublic

CustomersBusinessObject(

string

group

)

:

base(

group

){}//

Methodsoverridepublicvoid

ShowAll(){虹//

Ad窗d

s督epara顽tor

l忙ines雄

C阀onsol赵e.Wri骡teLin汇e();竖

C谱onsol求e.Wri惜teLin场e(

"-供-----构-----栗-----钻-----太---"

赢);唇辞base粪.Show消All()帝;股

C揪onsol刷e.Wri胸teLin测e(

"-赤-----愁-----弦-----顾-----易---"

域);派

}彼}朽//

"I涝mplem挂entor杆"尼abstr宁act录甩class蒜

Data崭O旬bject间{炕心//

Me猜thods零左abstr奸act孩市publi匪c酷多void罩

Next多Recor走d();捡凯abstr苦act贿愤publi语c倦镰void诸

Prio屠rReco勤rd();宰由abstr斧act密代publi努c撒陈void铸

NewR梁ecord紫(

串strin谎g好

name迅

);劫乔abstr例act敞泊publi识c痰寻void钟

Dele壮teRec灯ord(

伪strin涨g胃

name禾

);则缓abstr衡act息角publi京c董每void寨

Show崇Recor档d();冰甘abstr泡act幻举p饼ublic插科void开

Sho唱wAllR早ecord蚀s();廊}哗//旗

"Con贵crete件Imple夕mento车r"飞class炼

Cust咽omers暖DataO乒bject携

:

Da殖taObj肝ect薯{基困//

Fi酬elds亭忍priva尖te葛

Arra羡yList展

cust烤omers汤

=

抄new闭

Arra汗yList蝶();箱纯priva睁te越酱int呆

curr由ent

=支

0;老相//

Co刃nstru彩ctors题煌publi叶c崖

Cust脱omers猫DataO醉bject捧()辨展{茫抢//

Lo泉aded凭

from衣

a

da骄tabas江e存

c钢ustom见ers.A我dd(

"春Jim

J煮ones"医

);班

c亭ustom于ers.A赚dd(

"刮Samua芬l

Jac洲kson"慰

);叛

c阅ustom年ers.A个dd(

"材Allen渴

Good者"

);常

c孝ustom城ers.A饲dd(

"痒Ann

S袄tills肚"

);判

c痰ustom兆ers.A荒dd(

"钉Lisa

悦Giola姑ni"

)冠;季

}训叠//

Me纺thods袄欠publi驼c杂吉overr版ide浅魔void钩

Next惠Recor含d()轮广{挠赏if暮(

cur获rent

般<=

cu窃stome捧rs.Co既unt

-民

1

)顽绍

curr句ent++拜;晌

}谱潮publi之c线录overr典ide园饮void孕

Prio倾rReco蛙rd()巧熔{性甩if金(

cur瑞rent

拨>

0

)近谱

curr携ent--晌;府

}垒蜓publi炮c返勇overr循ide血凤void薄

NewR池ecord纵(

储strin丛g输

name座

)柴秩{暴

c识ustom京ers.纸Add(

划name

陕);右

}趣让publi敲c馆贴overr去id桑e截绪void幻

Dele稠teRec扒ord(

习strin颠g妇

name捏

)勉膀{漏

c适ustom久ers.R咐emove羽(

nam奉e

);桂

}筛茄publi倘c趁岸overr柱ide挺碌void诵

Show还Recor随d()饰陪{澡

C摧onsol理e.Wri拍teLin刘e(

cu识stome羊rs[

c投urren沸t

]

)播;都

}刊敢publi插c框启overr倦ide灯概void抱

Show泄AllRe皆cords辨()昌杏{演固f功oreac泛h参(

磁strin握g衰

name役盛in帝逼custo狸mers

语)扑症

Cons辫ole.W冶riteL纽ine(

默"

"

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论