定義:
動態的給對象添加一些額外的職責。就增長功能來講,裝飾模式相比生成子類更爲靈活。學習
使用場景:
- 在不影響其餘對象的狀況下,以動態、透明的方式給單個對象添加職責。
- 須要動態地給一個對象增長功能,這些功能也能夠動態地被撤銷。
- 當不能採用繼承的方式對系統進行擴充或者採用繼承不利於系統擴展和維護時。 不能採用繼承的狀況主要有兩類:
第一類是系統中存在大量獨立的擴展,爲支持每一種組合將產生大量的子類,使得子類數目呈爆炸性增加;第二類是由於類定義不能繼承(如final類)。
UML類圖:
優勢:
- 裝飾模式與繼承關係的目的都是要擴展對象的功能,可是裝飾模式能夠提供比繼承更多的靈活性。
- 能夠經過一種動態的方式來擴展一個對象的功能,經過配置文件能夠在運行時選擇不一樣的裝飾器,從而實現不一樣的行爲。
- 經過使用不一樣的具體裝飾類以及這些裝飾類的排列組合,能夠創造出不少不一樣行爲的組合。能夠使用多個具體裝飾類來裝飾同一對象,獲得功能更爲強大的對象。
- 具體構件類與具體裝飾類能夠獨立變化,用戶能夠根據須要增長新的具體構件類和具體裝飾類,在使用時再對其進行組合,原有代碼無須改變,符合「開閉原則」
缺點:
- 使用裝飾模式進行系統設計時將產生不少小對象,這些對象的區別在於它們之間相互鏈接的方式有所不一樣,而不是它們的類或者屬性值有所不一樣,同時還將產生不少具體裝飾類。這些裝飾類和小對象的產生將增長系統的複雜度,加大學習與理解的難度。
- 這種比繼承更加靈活機動的特性,也同時意味着裝飾模式比繼承更加易於出錯,排錯也很困難,對於屢次裝飾的對象,調試時尋找錯誤可能須要逐級排查,較爲煩瑣
事例:
人穿衣服設計