摘 要: 本文闡述了設(shè)計(jì)模式的定義及基本要素,分析了裝飾模式的結(jié)構(gòu)、動(dòng)機(jī)與目的,對(duì)比基于繼承與虛函數(shù)的實(shí)現(xiàn),提出了一種基于泛型的實(shí)現(xiàn)方法及代碼。最后討論了該實(shí)現(xiàn)方法的優(yōu)缺點(diǎn)。
關(guān)鍵詞: 設(shè)計(jì)模式; 泛型; 靜多態(tài); 動(dòng)多態(tài); 裝飾模式; 模板
1 引言
設(shè)計(jì)模式是對(duì)于某一類(lèi)的軟件設(shè)計(jì)問(wèn)題的可重用的解決方案。[1]在軟件開(kāi)發(fā)中,其主要作用為:重用設(shè)計(jì)、共用詞匯、方便交流、易于重構(gòu)。一個(gè)模式有四個(gè)基本要素:1)模式名稱(chēng),用于描述模式的問(wèn)題、解決方案和效果;2)問(wèn)題 用于解釋設(shè)計(jì)問(wèn)題和問(wèn)題存在的前因后果;3)解決方案 描述設(shè)計(jì)的組成部分、相互關(guān)系及其各種的職責(zé)和協(xié)作方式;4)效果 描述模式應(yīng)用的效果和使用模式應(yīng)權(quán)衡的問(wèn)題。[2]設(shè)計(jì)模式主要分為創(chuàng)建型、結(jié)構(gòu)型、行為型,裝飾模式是結(jié)構(gòu)型模式之一,其意圖是“動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職能”。
在面向?qū)ο蟪绦蛟O(shè)計(jì)中,封裝變化最主要的技術(shù)是多態(tài)。多態(tài)是同一實(shí)體同時(shí)具有多種形式,即同一操作作用于不同的對(duì)象,產(chǎn)生不同的執(zhí)行結(jié)果。多態(tài)分為動(dòng)多態(tài)、靜多態(tài)。動(dòng)多態(tài)是通過(guò)繼承和虛函數(shù)來(lái)實(shí)現(xiàn)的,在運(yùn)行期間,虛函數(shù)調(diào)用不同子類(lèi)型的虛成員函數(shù)以實(shí)現(xiàn)不同的功能。靜多態(tài)是通過(guò)泛型中模板實(shí)現(xiàn)的,在編譯期間,接口綁定不同的功能代碼。
當(dāng)前,設(shè)計(jì)模式的實(shí)現(xiàn)技術(shù)是使用動(dòng)多態(tài),即繼承與虛函數(shù)(接口與實(shí)現(xiàn))。其主要的問(wèn)題是,接口必須在公共基類(lèi)中預(yù)先設(shè)定,動(dòng)多態(tài)的綁定是入侵性的或者插入式的。針對(duì)這一問(wèn)題,本文以裝飾模式為例,使用靜多態(tài)給出非入侵性或非插入式的實(shí)現(xiàn)。
2 裝飾模式
裝飾模式是對(duì)象的結(jié)構(gòu)型模式,其動(dòng)機(jī)是:給對(duì)象添加額外的功能,同時(shí)避免給類(lèi)添加額外的功能。為了避免繼承的子類(lèi)獲得其不需要的功能,可使用裝飾模式。
裝飾模式結(jié)構(gòu)圖如圖1,[3]其參與者分別為:Component定義一個(gè)對(duì)象接口,可以給這些對(duì)象動(dòng)態(tài)地添加職責(zé);ConcreteComponent定義一個(gè)對(duì)象,可以給這個(gè)對(duì)象添加職責(zé);Decorater維持一個(gè)指向Component的指針,并定義一個(gè)與Component接口一致的接口。ConcreteDecorator向組件添加職責(zé)。對(duì)象協(xié)作中,Decorator將請(qǐng)求轉(zhuǎn)發(fā)給它的Component對(duì)象,并有可能在轉(zhuǎn)發(fā)請(qǐng)求前后執(zhí)行一些附加的動(dòng)作。
3 泛型與模板
泛型是現(xiàn)代程序設(shè)計(jì)語(yǔ)言的一種特性。泛型是一種特殊的類(lèi)型,其將指定類(lèi)型的工作延遲到客戶(hù)端代碼聲明并實(shí)例化類(lèi)或方法的時(shí)候,泛型將類(lèi)型參數(shù)化以達(dá)到代碼復(fù)用的目的,從而提高軟件開(kāi)發(fā)工作效率。
不同的語(yǔ)言支持的泛型的特性不同。.NET泛型是具有占位符(類(lèi)型參數(shù))的類(lèi)、結(jié)構(gòu)、接口和方法,這些占位符是類(lèi)、結(jié)構(gòu)、接口和方法所存儲(chǔ)或使用的一個(gè)或多個(gè)類(lèi)型的占位符。泛型集合類(lèi)可以將類(lèi)型參數(shù)用作其所存儲(chǔ)的對(duì)象的類(lèi)型的占位符;類(lèi)型參數(shù)作為其字段的類(lèi)型及其方法的參數(shù)類(lèi)型出現(xiàn)。泛型方法可以將其類(lèi)型參數(shù)用作其返回值的類(lèi)型或者其某個(gè)形參的類(lèi)型。Java 泛型的參數(shù)只代表類(lèi),不能代表個(gè)別對(duì)象。由于 Java 泛型的類(lèi)型參數(shù)之實(shí)際類(lèi)型在編譯時(shí)會(huì)被消除,所以無(wú)法在運(yùn)行時(shí)得知其類(lèi)型參數(shù)的類(lèi)型。Java?編譯器在編譯泛型時(shí)會(huì)自動(dòng)加入類(lèi)型轉(zhuǎn)換的編碼,因此其運(yùn)行速度不會(huì)因?yàn)槭褂梅盒投涌臁4] 在C++ 中,泛型即模板,其無(wú)法對(duì)泛型的類(lèi)型參數(shù)進(jìn)行約束,在編譯時(shí),每個(gè)使用的封閉泛型類(lèi)型都有獨(dú)立的編碼產(chǎn)生,編譯器確保其類(lèi)型安全性。[5]C++模板有兩種類(lèi)型,函數(shù)模板與類(lèi)模板。下面以C++模板為例,給出裝飾模式的實(shí)現(xiàn)方法。
4 泛型實(shí)現(xiàn)裝飾模式
基于泛型的靜多態(tài)為實(shí)現(xiàn)設(shè)計(jì)模式提供了新方法。靜多態(tài)的實(shí)現(xiàn)類(lèi)型在編譯期中確定,從而可以避免使用指針,其具備更好的類(lèi)型安全性,更高的效率。下面是其實(shí)現(xiàn)結(jié)構(gòu)圖。
Class ConcreteDecoratorA {
Public:
Void operation() const;
Void AddedBehaviorA() const;
}
Class ConcreteDecoratorB{
Public:
Void operation() const;
Void AddedBehaviorB() const;
}
Template
Class RefinedComponent {
Private:
T const decorator;
Public:
Void Operation() ;
}
Template
Void RefinedComponent
{
decorator.operation();
}
在基于泛型的裝飾模式實(shí)現(xiàn)中,由于基類(lèi)變成泛型,實(shí)現(xiàn)了非入侵性或非插入式的綁定。
同時(shí),基于靜多態(tài)的實(shí)現(xiàn)代碼數(shù)量也減小。
5優(yōu)點(diǎn)與缺點(diǎn)
基于泛型的裝飾模式具有以下優(yōu)點(diǎn):1)無(wú)需通過(guò)公共基類(lèi)來(lái)表達(dá)接口的共性,更便于實(shí)現(xiàn)內(nèi)建類(lèi)型的集合;2)不通過(guò)指針進(jìn)行間接調(diào)用,生成的代碼效率較高;3)對(duì)于提供部分接口的具體類(lèi)型也可以調(diào)用;4)靜多態(tài)在編譯期對(duì)所有的綁定操作進(jìn)行檢查,具有更好的類(lèi)型安全性。其缺點(diǎn)是:1)不能優(yōu)雅地處理異類(lèi)集合;2)實(shí)現(xiàn)代碼雖小,但可執(zhí)行生成代碼較大;具體實(shí)現(xiàn)中,可根據(jù)其優(yōu)缺點(diǎn)進(jìn)行選擇。
6 結(jié)束語(yǔ)
綜上所述,裝飾模式可通過(guò)繼承與虛函數(shù)實(shí)現(xiàn),也可通過(guò)泛型和模板實(shí)現(xiàn)。不同封裝變化的技術(shù)可以實(shí)現(xiàn)相同的功能,本文給出了裝飾模式基于泛型的實(shí)現(xiàn)方法及代碼,其他模式也可通過(guò)泛型實(shí)現(xiàn)。
參考文獻(xiàn)
[1] Gamma Erich.設(shè)計(jì)模式可復(fù)用面向?qū)ο筌浖幕A(chǔ)[M].北京:北京機(jī)械工業(yè)出版, 2000.
[2] 拉爾曼.UML 和模式應(yīng)用:面向?qū)ο蠓治雠c設(shè)計(jì)導(dǎo)論[M].北京:北京機(jī)械工業(yè)出版社, 2001.
[3] Shalloway Alan.設(shè)計(jì)模式解析[M].北京:中國(guó)電力出版社, 2003.
[4] Wu T C.Java 面向?qū)ο蟪绦蛟O(shè)計(jì)[M].第 2 版.北京:清華大學(xué)出版社, 2002.
[5] (美)MatthewH.Austern著,侯捷譯.泛型編程與STL[M]. 中國(guó)電力出版社, 2003
作者簡(jiǎn)介:陳輝(1973-),男,漢族,湖北武漢人,浙江商業(yè)職業(yè)技術(shù)學(xué)院,講師,研究方向?yàn)橛?jì)算機(jī)網(wǎng)絡(luò)和軟件理論。