當我們完成一個軟體産品開發後就需要對其進行各種測試,适配快速疊代下品質的保障。當有一個完善的産品的對象後,如果我們想要給他添加一個測試功能,那麼我們可以用一個新的類去裝飾它來實作對原有對象職責的擴充。新的類稱為“裝飾者”,原有的對象稱為“被裝飾者”。這種模式被稱為裝飾器模式。
裝飾器模式(Decorator Pattern)允許向一個現有的對象添加新的功能,同時又不改變其結構。這種類型的設計模式屬于結構型模式,它是作為現有的類的一個包裝。
這種模式建立了一個裝飾類,用來包裝原有的類,并在保持類方法簽名完整性的前提下,提供了額外的功能。
我們通過下面的執行個體來示範裝飾器模式的用法。其中,我們将把一個形狀裝飾上不同的顔色,同時又不改變形狀類。

裝飾器模式中的角色:
抽象構件(Component)角色:聲明封裝器和被封裝對象的公用接口。即給出一個抽象接口,已規範準備接收附加責任的對象。
具體構件(ConcreteComponent)角色:類是被封裝對象所屬的類。 它定義了基礎行為, 但裝飾類可以改變這些行為。
裝飾(Decorator)角色:擁有一個指向被封裝對象的引用成員變量。 該變量的類型應當被聲明為通用部件接口, 這樣它就可以引用具體的部件和裝飾。 裝飾基類會将所有操作委派給被封裝的對象。
具體裝飾(ConcreteDecorator)角色:定義了可動态添加到部件的額外行為。 具體裝飾類會重寫裝飾基類的方法, 并在調用父類方法之前或之後進行額外的行為。負責給構件對象“貼上”附加的責任。
實作一個開發完成後的産品,對其進行手工功能測試、自動化測試、壓力測試。将産品作為被裝飾者,也就是構件。各種測試作為裝飾者,計算附加不同的測試花費的總時間。
定義一個産品抽象類。
實作具體的産品,具體的産品繼承産品抽象類。
定義一個測試類型的抽象裝飾類,繼承産品抽象類。
實作不同類型的測試,繼承測試類型的抽象裝飾類。
使用時執行個體化一個産品,然後對産品進行附件不同的測試類型。
運作後結果:
在無需修改代碼的情況下即可使用對象, 且希望在運作時為對象新增額外的行為時可以使用裝飾模式。因為裝飾能将業務邏輯組織為層次結構,可為各層建立一個裝飾, 在運作時将各種不同邏輯組合成對象。 由于這些對象都遵循通用接口, 用戶端代碼能以相同的方式使用這些對象。
如果用繼承來擴充對象行為的方案難以實作或者根本不可行,可以使用裝飾模式。
無需建立新子類即可擴充對象的行為。
可以在運作時添加或删除對象的功能。
可以用多個裝飾封裝對象來組合幾種行為。
裝飾類和被裝飾類可以獨立發展,不會互相耦合。
單一職責原則。 可以将實作了許多不同行為的一個大類拆分為多個較小的類。
在封裝器棧中删除特定封裝器比較困難。
實作行為不受裝飾棧順序影響的裝飾比較困難。
各層的初始化配置代碼看上去可能會很糟糕。