HeadFirst 設計模式學習筆記3--裝飾模式

1.這個模式可以稱爲“給愛用繼承的人一個全新的設計眼界”的模式。牽扯到第五個設計原則:“類應該對擴展開放,而對修改封閉”。但是要注意,遵循這一標準會帶來更多層次上的抽象,增加代碼的複雜度,所以並不是所有類都要這樣設計。

2.文中舉了一個爲辛巴克咖啡館寫一個計算咖啡價格+調料價格的類,使用了裝飾模式——動態的將責任附加到對象上,若要擴展功能,裝飾者提供了比繼承更加有彈性的替代方案。我們就拿這個計算咖啡價格的東西舉例子。

3.在原來的設計中,都是繼承與Beverage這個超類中,多一項咖啡+調料組合就多一個子類,最後造成類的爆炸。而使用裝飾模式,我們希望用裝飾器(這裏的調料)一層層的包含被裝飾的咖啡,最後達到通過調用最外層的裝飾者的cost()方法就可以委託其內部計算計算價錢。我們針對這個目標,從代表飲品的Beverage類下手:

我們將調料視爲裝飾器,這個裝飾器超類爲了能夠將要被裝飾的部分包起來,所以要繼承自飲品這個超類:

現在我們就構造一些飲品

然後我們構建具體的裝飾者,比如代表摩卡的Mocha類:

現在我們測試一下這些代碼,喝杯比較多樣化的咖啡:

4.總結一下裝飾模式特點:

裝飾者和被裝飾對象有相同的超類型--都是來自Beverage這個類。
你可以用一個或多個裝飾者包裝一個對象--看看beverage3這個對象就知道了。
在任何需要被包裝者的場合可以用裝飾過的對象代替它--比如首先我們在咖啡上加豆漿,然後我們在加豆漿的咖啡上想再加摩卡的話,我們可以直接在這個加過豆漿的咖啡對象上加摩卡。
裝飾者可以在所委託的被裝飾者的行爲上加上自己的行爲,達到特定目的--getDescription和cost方法充分證明了這一點。
5.JDK中的裝飾模式

最典型的就是IO系統了,比如BufferedInputStream及LineNumberInputStream都擴展自FilterInputStream——這個類是一個抽象的裝飾類。而最高的抽象組件是InputStream類。

我們也可以以假亂真寫一個輸入流類

6.裝飾模式的一些缺陷:

產生各種小類,維護不便。有些代碼會依賴特定的類型,而這樣的代碼一導入裝飾者就出問題了。

 

示例代碼下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章