Template Method使用了對象繼承,而繼承是壹種很強的對象和對象之間的耦合關系,底層模塊還是依賴於高層模塊,比如子類要知道哪些abstract method要重寫,哪些hook method可以做擴展,哪些基類資源可以利用。
strategy模式使用對象之間的組合關系來代替繼承,進壹步減弱高層模塊和底層模塊之間的依賴,讓底層獨立於高層,使其完全符合更符合DIP的原則, 這樣底層代碼不需要了解高層代碼是怎麽工作的,高層也不需要知道底層的實現細節,
相對於Template Method模式來說strategy模式革命的更徹底壹些。
還拿Report來作壹個簡單的例子。
Report的輸出可以是Html格式的,可以是Word格式的,也可以是PDF格式的,我們可以定義壹個Interface:IReportPublisher,在IReportPublisher中定義高層模塊和低層模塊之間的調用協議。(或者說Contract)
Interface IReportPublisher {public void Publish()}
HTMLReportPublisher : IReportPublisher
WordReportPublisher : IReportPublisher
PDFReportPublisher : IReportPublisher
Report
{
Public void GenerateReport()
{
…
reportPublisher = MyContext.GetService(…)
reportPublisher.Publish(reportData)
…
}
}
當然實現strategy模式也有代價,將Template Method改造成strategy模式後,架構中層次變復雜了,壹些Template Method模式原有的特性就沒有辦法利用了,比如子類可以調用基類壹些資源。
應用任何壹種模式都會有代價,學習模式時,明白為什麽這麽做比明白怎麽實現更重要,了解模式帶來的收益的同時也要了解妳要付出的代價。模式也是壹直隨著技術的發展在發展的,有些模式在慢慢消亡,有些新的模式出現,有些模式被新的編程語言天然支持,有些模式的形式發生了變化,Gof的《設計模式》裏的壹些觀點現在來說已經是有些過時了。
strategy模式和Template Method模式的對比還體現了面向對象的另壹個思想,解決對象之間的協作問題應用對象組合優先於對象繼承。在面向對象的初期,人們非常看重對象繼承,繼承壹個類,就可以重用該類的代碼,把很多類的代碼抽取到壹個基類中就可以去掉代碼重復,創建壹個子類,改變壹點點就能創造出壹個能實現新功能的類出來,通過繼承我們可以建立完整的軟件結構分類,每壹層都可以重用該層以上的代碼,這看起來很美好,到後來人們才慢慢發現繼承非常容易被過度使用,而過度使用帶來的收益比代價要高的多,所以我們減少對繼承的使用,用組合和委托來代替繼承。
strategy模式和Template Method模式都面對壹個問題,在運行時怎麽創建某個子類或者某個實現了某個interface的類的實例,那就涉及關於創建對象實例的模式:Singleton模式和Factory模式。
/content/view/15_38.html
看看吧,也許對妳有所幫助.