DECORATOR(裝飾)—對象結構型模式

裝飾模式

  • 什麼是裝飾模式
    動態地給一個對象添加額外的職責,就增加功能來說,裝飾模式比生成子類更加靈活。別名,包裝器Wrapper

  • 什麼場景會用到裝飾模式
    有時我們希望給某個對象而不是整個類添加一些功能。例如,一個圖形用戶界面工具箱
    允許你對任意一個用戶界面組件添加一些特性,例如邊框,或是一些行爲,例如窗口滾動。
    使用繼承機制是添加功能的一種有效途徑,從其他類繼承過來的邊框特性可以被多個子
    類的實例所使用。但這種方法不夠靈活,因爲邊框的選擇是靜態的,用戶不能控制對組件加
    邊框的方式和時機。
    一種較爲靈活的方式是將組件嵌入另一個對象中,由這個對象添加邊框。我們稱這個嵌
    入的對象爲 裝飾 。這個裝飾與它所裝飾的組件接口一致,因此它對使用該組件的客戶透明。
    它將客戶請求轉發給該組件,並且可能在轉發前後執行一些額外的動作(例如畫一個邊框)。
    透明性使得你可以遞歸的嵌套多個裝飾,從而可以添加任意多的功能。優點,把類中的裝飾功
    能從類中移除,這樣可以簡化原有的類。

    我們現在想象這樣一個場景。有一家奶茶店,用戶可以根據自己的需要選擇加什麼,有的喜歡加奶,有的願意加糖,有的在夏天裏還要多加點冰,每種添加物的價錢都是不一樣的,比如加糖是1塊錢,加奶是兩塊錢,加冰的話免費,原料都是紅茶,只不過是在原料的基礎上添加各種添加物,最終表現出不同的口味。

  • 適用性
    以下情況使用Decorator模式
    • 在不影響其他對象的情況下,以動態、透明的方式給單個對象添加職責。
    • 處理那些可以撤消的職責。
    • 當不能採用生成子類的方法進行擴充時。一種情況是,可能有大量獨立的擴展,爲支持
    每一種組合將產生大量的子類,使得子類數目呈爆炸性增長。另一種情況可能是因爲類
    定義被隱藏,或類定義不能用於生成子類。

相關參考:
<大話設計模式>,<設計模式,可複用面向對象軟件的基礎>,<Head First 設計模式>
源碼在此

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