裝飾模式以對客戶端透明的方式擴展對象的功能,是繼承關係的一個替代方案。
- Compoment:給出一個接口,以規範準備接收附加責任的對象
- ConcreteCompoment:將要接收附加責任的類
- Decorator:持有一個Compoment實例,並定義一個與Compoment一致的接口
- ConCreteDecorator:負責貼上額外的功能
什麼情況下使用:
- 擴展一個類的功能,或者給一個類附加功能
- 動態的附加功能,還可以撤銷
- 需要增加由一些基本功能的排列組合的而產生的非常大量的功能,從而是繼承關係變的不現實。
優點:
- 裝飾模式比繼承更靈活,裝飾模式支持系統動態的給對象貼上一個功能,或者除掉一個功能;繼承則不同,它是靜態的,他在系統運行前就決定了。
- 通過使用不同的具體裝飾類,以及這些裝飾類的排列組合,可以創造出很多不同的行爲組合。
缺點:
- 優點2提供的更加靈活機動的特性,也意味着比繼承更加容易出錯。
- 使用裝飾模式會產生更多對象相對於繼承,更多的對象對於排錯更加困難,特別是這些對象看上去都很相像。