天天看點

裝飾模式       模型 示例     小結

    在起初的設計中,當系統需要新功能的時候,是向舊的類中添加新的代碼,這些新加的代碼通常裝飾了原有類的核心職責或主要行為。但這種做法的問題在于,在主類中加入了新的字段,新的方法和新的邏輯,進而增加了主類的複雜度。  而這些新加入的東西僅僅是為了滿足一些隻在某種特定情況下才會執行的特殊行為的需要。而裝飾模式卻提供了一個解決方案,它把每個要裝飾的功能放在單獨的類中,并讓這個類包裝它所要裝飾的對象,是以,當需要執行特殊行為時,客戶代碼就可以在運作時根據需要有選擇地,按順序地使用裝飾功能包裝對象了。

裝飾模式       模型 示例     小結

     裝飾的方法:

首先用ConcreteComponent執行個體化對象c,然後用ConcreteDecoratorA的執行個體化對象d1來包裝c,再用ConcreteDecoratorB的對象d2包裝d1,最終執行d2的operation()。代碼如下:

裝飾模式       模型 示例     小結

裝飾模式是利用SetComponent來對對象進行包裝的。這樣每個裝飾對象的實作就和如何使用這個對象分離開了,每個裝飾對象隻關心自己的功能,不需要關心如何被添加到對象鍊中。

裝飾模式優點:

把類中的裝飾功能從類中搬移去除,這樣可以簡化原有的類。

有效地把類的核心職責和裝飾功能區分開了,而且可以去除相關類中重複的裝飾邏輯。

     比如,大家在第一次約會的時候,都會很緊張的精心打扮,這時候,對人的裝飾打扮的過程就是一個裝飾模式。模型圖如下:

裝飾模式       模型 示例     小結

   但是,這個模型有一點缺少,就是沒有強調裝飾的順序。比如,我可以先穿上衣,再穿褲子什麼的,也可以先穿褲子,再穿上衣。

    是以,為了形象的描述裝飾的順序,再舉一個包裝禮品的例子。

    比如聖誕節的時候,大家要互送禮物,這時,對禮物進行包裝,要先把禮物放到盒子裡,然後再包上彩紙,然後綁上彩帶,這裡,就有一個嚴格的順序了。

    如下,模型圖:

裝飾模式       模型 示例     小結

   代碼如下:

在主函數中,下面這三行代碼的順序就是要注意的:

  裝飾模式動态地給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。

繼續閱讀