裝飾模式又叫包裝模式,裝飾模式以客戶端透明的方式擴展對象的功能,是繼承關係的一個替代方案。裝飾模式能夠在不使用創造更多的子類的狀況下,將對象的功能加以擴展。設計
裝飾模式結構圖以下:3d
其包含的角色就分爲:對象
抽象構建角色Component:給出一個抽象結構,以規範準備接受附加責任的對象。blog
具體構建角色Concrete Component:定義一個將要接受附加責任的類。繼承
裝飾角色Decorator:持有一個構建Component對象的實例,並定義一個與抽象構建一直的接口接口
具體裝飾角色Concrete Decorator:負責給構建對象增長附加責任。get
在如下的狀況下應當使用裝飾模式:it
一、 須要擴展一個類的功能,或給一個類增長附加責任。擴展
二、 須要動態的給一個對象增長功能,這些功能能夠再動態地撤銷。im
三、 須要增長由一些基本功能排列組合而產生的很是大量的功能,從而使繼承關係變得不現實。
使用裝飾模式有如下的優勢:
一、 裝飾模式與繼承關係的目的都是擴展對象的功能,可是裝飾模式能夠提供比繼承更多的靈活性。
二、 經過使用不一樣的具體裝飾類以及這些裝飾類的排列組合,設計師能夠創造出不少不一樣行爲的組合。
三、 這種比繼承更加靈活機動的特性,也同時意味着裝飾模式比繼承更加容易出錯。
使用裝飾模式有如下的缺點:
因爲使用裝飾模式,能夠比使用繼承關係須要較少數目的類。使用較少的類,固然使設計比較易於進行,可是,在另外一方便,使用裝飾模式會產生比使用繼承關係更多的對象。更多的對象會使得查錯變得困難,特別是這些對象看上去都很相像。