一、Decorator模式的定義:
“Decorator”一詞在英文中的意思是“裝飾工”的意思,在設計模式中“Decorato模式”的作用也是“動態地給對象增加一些職責”。請注意:這句話中有2個重點的地方:
·動態:也就是說無法預先在編譯階段就知道職責的具體內容和添加時機,什么時候添加什么功能完全由客戶在運行時刻規定。
·增加:“Decorator模式”往往用于在現有功能的基礎上針對不同的對象,添加一些不同的功能,實際上我們還可以改變行為的流程。
二、Decorator模式的好處:
我們知道,有時候在同一個運行環境下,由于不同對象具有不同的特性導致了它們在執行同一種類型操作時,可能存在一些細小的差別,這些差別可能體現在:
第一 參數不同
第二 過程不同
第三 方式不同
那么針對這三種情況我們可以采取的解決方法有兩種:
第一 采用繼承的方式。定義一個父類的抽象方法,由不同的子類各自實現不同的操作,但一旦子類一多勢必帶來類的數量膨脹的問題,難以管理;其次如果只是一些局部的細微差別而導致了必須重寫整個過程或方法,那么必將導致出現大量的重復代碼(即功能相同部分的代碼)。我曾經看過一些項目,里面存在了大量的重復代碼,到處都是“Copy-Paste”.只是修改了某處的關鍵參數而已。
而“Duplicate code”正是《重構-改善既有代碼的設計》一書中提到的首要“異味”,這意味著一旦公共部分的功能改變了,那么你有可能需要重新編譯幾個甚至十幾個子類。
第二 采用“Decorator模式”。首先將功能分解,分成若干個小塊,這是為了后面我們可以動態地重組。其次將功能部分抽取出來成為一個接口,通過一個實現了接口的基類完成基本的共有功能。一旦我們需要在基類的功能基礎上添加或改變流程,我們就可以通過“Decorator類”實現接口,在接口的實現方法中增加、改變方法的功能或流程。
比較上面這兩種做法,我們可以看到使用了“Decorator模式”后,代碼更加簡潔了,可重用性和可擴展性更高了。其次由于可以在構造“Decorator類”的過程中傳遞參數,我們可以動態的增加、改變原有的功能、流程,而相同部分的功能則委托給基類去完成。最后由于“油漆工”在“被油漆物”外面刷了一層油漆,里面怎么改變對外界來說是透明的。
三、Decorator模式的適應場合:
Decrator模式的適用場合:
1).在運行時刻由用戶動態決定加入的方式和時機,無法在編譯期間決定
2).需要改變的行為太多,用繼承會導致復雜性的增加
四、Decorator模式與Adapater、Builder模式的區別:
Adapter和Decorator模式的區別:
1).前者關注的是如何將兩個本來互不相關的類糅合到一起,后者關注的是如何在原來功能的基礎上做一些小的調整
Builder和Decorator模式的區別:
1).前者關注的是對象的構建,后者關注的是對象功能的添加、個性化
2).前者主要用于GUI界面構建對象的場合、后者主要用于動態添加功能、改變流程的場合
-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
posted on 2008-02-19 16:33
Paul Lin 閱讀(2093)
評論(0) 編輯 收藏 所屬分類:
模式與重構