資源描述:
《設(shè)計(jì)模式(16)-Bridge》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、一、橋梁(Bridge)模式橋梁模式是一個(gè)非常有用的模式,也是比較復(fù)雜的一個(gè)模式(注:《Java與模式》一書認(rèn)為Bridge模式不是一個(gè)使用頻率很高的模式,我不太贊同,我認(rèn)為Bridge模式中蘊(yùn)涵了很多設(shè)計(jì)模式的關(guān)鍵思想在里面,所以我這里采納了《DesignPatternsExplained》一書的作者AlanShalloway與JamesR.Trott的觀點(diǎn):TheBridgepatternisquiteabitmorecomplexthantheotherpatternsyoujustlearned;itisalsomuchmoreuseful)。熟悉這個(gè)模式對于理解面向?qū)ο蟮脑O(shè)計(jì)原
2、則,包括“開-閉”原則(OCP)以及組合/聚合復(fù)用原則(CARP)都很有幫助。理解好這兩個(gè)原則,有助于形成正確的設(shè)計(jì)思想和培養(yǎng)良好的設(shè)計(jì)風(fēng)格。橋梁模式的用意【GOF95】在提出橋梁模式的時(shí)候指出,橋梁模式的用意是“將抽象化(Abstraction)與實(shí)現(xiàn)化(Implementation)脫耦,使得二者可以獨(dú)立地變化”。這句話有三個(gè)關(guān)鍵詞,也就是抽象化、實(shí)現(xiàn)化和脫耦。抽象化存在于多個(gè)實(shí)體中的共同的概念性聯(lián)系,就是抽象化。作為一個(gè)過程,抽象化就是忽略一些信息,從而把不同的實(shí)體當(dāng)做同樣的實(shí)體對待【LISKOV94】。實(shí)現(xiàn)化抽象化給出的具體實(shí)現(xiàn),就是實(shí)現(xiàn)化。脫耦所謂耦合,就是兩個(gè)實(shí)體的行為的某種
3、強(qiáng)關(guān)聯(lián)。而將它們的強(qiáng)關(guān)聯(lián)去掉,就是耦合的解脫,或稱脫耦。在這里,脫耦是指將抽象化和實(shí)現(xiàn)化之間的耦合解脫開,或者說是將它們之間的強(qiáng)關(guān)聯(lián)改換成弱關(guān)聯(lián)。將兩個(gè)角色之間的繼承關(guān)系改為聚合關(guān)系,就是將它們之間的強(qiáng)關(guān)聯(lián)改換成為弱關(guān)聯(lián)。因此,橋梁模式中的所謂脫耦,就是指在一個(gè)軟件系統(tǒng)的抽象化和實(shí)現(xiàn)化之間使用組合/聚合關(guān)系而不是繼承關(guān)系,從而使兩者可以相對獨(dú)立地變化。這就是橋梁模式的用意。一、橋梁模式的結(jié)構(gòu)橋梁模式【GOF95】是對象的結(jié)構(gòu)模式,又稱為柄體(HandleandBody)模式或接口(Interface)模式。下圖所示就是一個(gè)實(shí)現(xiàn)了橋梁模式的示意性系統(tǒng)的結(jié)構(gòu)圖??梢钥闯?,這個(gè)系統(tǒng)含有兩個(gè)等級
4、結(jié)構(gòu),也就是:l由抽象化角色和修正抽象化角色組成的抽象化等級結(jié)構(gòu)。l由實(shí)現(xiàn)化角色和兩個(gè)具體實(shí)現(xiàn)化角色所組成的實(shí)現(xiàn)化等級結(jié)構(gòu)。橋梁模式所涉及的角色有:l抽象化(Abstraction)角色:抽象化給出的定義,并保存一個(gè)對實(shí)現(xiàn)化對象的引用。l修正抽象化(RefinedAbstraction)角色:擴(kuò)展抽象化角色,改變和修正父類對抽象化的定義。l實(shí)現(xiàn)化(Implementor)角色:這個(gè)角色給出實(shí)現(xiàn)化角色的接口,但不給出具體的實(shí)現(xiàn)。必須指出的是,這個(gè)接口不一定和抽象化角色的接口定義相同,實(shí)際上,這兩個(gè)接口可以非常不一樣。實(shí)現(xiàn)化角色應(yīng)當(dāng)只給出底層操作,而抽象化角色應(yīng)當(dāng)只給出基于底層操作的更高一層
5、的操作。l具體實(shí)現(xiàn)化(ConcreteImplementor)角色:這個(gè)角色給出實(shí)現(xiàn)化角色接口的具體實(shí)現(xiàn)。一、橋梁模式的示意性源代碼//Bridgepattern--StructuralexampleusingSystem;//"Abstraction"classAbstraction{//FieldsprotectedImplementorimplementor;//PropertiespublicImplementorImplementor{set{implementor=value;}}//MethodsvirtualpublicvoidOperation(){implemento
6、r.Operation();}}//"Implementor"abstractclassImplementor{//MethodsabstractpublicvoidOperation();}//"RefinedAbstraction"classRefinedAbstraction:Abstraction{//MethodsoverridepublicvoidOperation(){implementor.Operation();}}//"ConcreteImplementorA"classConcreteImplementorA:Implementor{//Methodsoverrid
7、epublicvoidOperation(){Console.WriteLine("ConcreteImplementorAOperation");}}//"ConcreteImplementorB"classConcreteImplementorB:Implementor{//MethodsoverridepublicvoidOperation(){Console.WriteLine("ConcreteImplementorBOp