陳 輝
(浙江商業(yè)職業(yè)技術(shù)學(xué)院信息技術(shù)學(xué)院,浙江 杭州 310053)
設(shè)計模式是對于某一類的軟件設(shè)計問題的可重用的解決方案。[1]在軟件開發(fā)中,其主要作用為:重用設(shè)計、共用詞匯、方便交流、易于重構(gòu)。一個模式有四個基本要素:1)模式名稱,用于描述模式的問題、解決方案和效果;2)問題 用于解釋設(shè)計問題和問題存在的前因后果;3)解決方案 描述設(shè)計的組成部分、相互關(guān)系及其各種的職責(zé)和協(xié)作方式;4)效果 描述模式應(yīng)用的效果和使用模式應(yīng)權(quán)衡的問題。[2]設(shè)計模式主要分為創(chuàng)建型、結(jié)構(gòu)型、行為型,橋梁模式是結(jié)構(gòu)型模式之一,其意圖是“將抽象化與實現(xiàn)脫耦,使得二者可以獨立變化”。
在面向?qū)ο蟪绦蛟O(shè)計中,封裝變化最主要的技術(shù)是多態(tài)。多態(tài)是同一實體同時具有多種形式,即同一操作作用于不同的對象,產(chǎn)生不同的執(zhí)行結(jié)果。多態(tài)分為動多態(tài)、靜多態(tài)。動多態(tài)是通過繼承和虛函數(shù)來實現(xiàn)的,在運行期間,虛函數(shù)調(diào)用不同子類型的虛成員函數(shù)以實現(xiàn)不同的功能。靜多態(tài)是通過泛型中模板實現(xiàn)的,在編譯期間,接口綁定不同的功能代碼。
當(dāng)前,設(shè)計模式的實現(xiàn)技術(shù)是使用動多態(tài),即繼承與虛函數(shù)(接口與實現(xiàn))。其主要的問題是,接口必須在公共基類中預(yù)先設(shè)定,動多態(tài)的綁定是入侵性的或者插入式的。針對這一問題,本文以橋梁模式為例,使用靜多態(tài)給出非入侵性或非插入式的實現(xiàn)。
橋梁模式是對象的結(jié)構(gòu)型模式,其動機(jī)是:當(dāng)一個抽象可能有多個實現(xiàn)時,通常用繼承來協(xié)調(diào)。抽象類定義對該抽象的接口,具體的子類使用不同的方式實現(xiàn)。此方法不夠靈活,繼承機(jī)制將抽象部分與實現(xiàn)部分固定在一起,難以對抽象部分和實現(xiàn)部分獨立進(jìn)行修改、擴(kuò)充和重用。為解決上述問題,可使用橋梁模式。
橋梁模式結(jié)構(gòu)圖如圖1 所示,[3]其參與者分別為:Abstraction 定義抽象類的接口,維護(hù)一個執(zhí)行Implementor 類型的指針;RefinedAbstraction 擴(kuò)充由Abstraction 定義的接口;Implementor 定義實現(xiàn)類的接口,該接口與Abstraction 可以不同,Implementor 接口僅提供基本操作,而Abstraction 定義基于這些基本操作的較高層次的操作;ConcreteImplementor 實現(xiàn)Implementor 接口并定義其具體實現(xiàn)。對象協(xié)作中,Abstraction 將client 的請求轉(zhuǎn)發(fā)給Implementor 對象。
泛型是現(xiàn)代程序設(shè)計語言的一種特性。泛型是一種特殊的類型,其將指定類型的工作延遲到客戶端代碼聲明并實例化類或方法的時候,泛型將類型參數(shù)化以達(dá)到代碼復(fù)用的目的,從而提高軟件開發(fā)工作效率。
不同的語言支持的泛型的特性不同。.NET 泛型是具有占位符(類型參數(shù))的類、結(jié)構(gòu)、接口和方法,這些占位符是類、結(jié)構(gòu)、接口和方法所存儲或使用的一個或多個類型的占位符。泛型集合類可以將類型參數(shù)用作其所存儲的對象的類型的占位符;類型參數(shù)作為其字段的類型及其方法的參數(shù)類型出現(xiàn)。泛型方法可以將其類型參數(shù)用作其返回值的類型或者其某個形參的類型。Java 泛型的參數(shù)只代表類,不能代表個別對象。由于Java 泛型的類型參數(shù)之實際類型在編譯時會被消除,所以無法在運行時得知其類型參數(shù)的類型。Java 編譯器在編譯泛型時會自動加入類型轉(zhuǎn)換的編碼,因此其運行速度不會因為使用泛型而加快。[3]在C++中,泛型即模板,其無法對泛型的類型參數(shù)進(jìn)行約束,在編譯時,每個使用的封閉泛型類型都有獨立的編碼產(chǎn)生,編譯器確保其類型安全性。[4]C++模板有兩種類型,函數(shù)模板與類模板。下面以C++模板為例,給出橋梁模式的實現(xiàn)方法。
基于泛型的靜多態(tài)為實現(xiàn)設(shè)計模式提供了新方法。靜多態(tài)的實現(xiàn)類型在編譯期中確定,從而可以避免使用指針,其具備更好的類型安全性,更高的效率。下面是其實現(xiàn)設(shè)計。
在基于泛型的橋梁模式實現(xiàn)中,由于基類變成泛型,實現(xiàn)了非入侵性或非插入式的綁定。
同時,基于靜多態(tài)的實現(xiàn)代碼數(shù)量也減小。
基于泛型的橋梁模式具有以下優(yōu)點:1)無需通過公共基類來表達(dá)接口的共性,更便于實現(xiàn)內(nèi)建類型的集合;2)不通過指針進(jìn)行間接調(diào)用,生成的代碼效率較高;3)對于提供部分接口的具體類型也可以調(diào)用;4)靜多態(tài)在編譯期對所有的綁定操作進(jìn)行檢查,具有更好的類型安全性。其缺點是:1)不能優(yōu)雅地處理異類集合;2)實現(xiàn)代碼雖小,但可執(zhí)行生成代碼較大;具體實現(xiàn)中,可根據(jù)其優(yōu)缺點進(jìn)行選擇。
綜上所述,橋梁模式可通過繼承與虛函數(shù)實現(xiàn),也可通過泛型和模板實現(xiàn)。不同封裝變化的技術(shù)可以實現(xiàn)相同的功能,本文給出了橋梁模式基于泛型的實現(xiàn)方法及代碼,其他模式也可通過泛型實現(xiàn)。
[1]Gamma Erich.設(shè)計模式可復(fù)用面向?qū)ο筌浖幕A(chǔ)[M].北京:機(jī)械工業(yè)出版社,2000.
[2]拉爾曼.UML 和模式應(yīng)用:面向?qū)ο蠓治雠c設(shè)計導(dǎo)論[M].北京:機(jī)械工業(yè)出版社,2001.
[3]Wu T C.Java 面向?qū)ο蟪绦蛟O(shè)計[M].2 版.北京:清華大學(xué)出版社,2002.
[3][美]MatthewH.Austern.泛型編程與STL[M].侯捷,譯.北京:中國電力出版社,2003.