裝飾模式:動態地給乙個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。
設計原則:
1. 多用組合,少用繼承
。
利用繼承設計子類的行為,是在編譯時靜態決定的,而且所有的子類都會繼承到相同的行為。然而,如果能夠利用組合的做法擴充套件物件的行為,就可以在執行時動態地進行擴充套件。
2. 類應設計的對擴充套件開放,對修改關閉。
裝飾模式是對物件進行包裝,這樣每個裝飾物件的實現就能和如何使用這個物件分離開了,每個裝飾物件只關心自己的功能,不需要關心如何被新增到對項鍊中!
關於「小菜」穿著的例項,通過裝飾模式可以為小菜增加好多的服飾種類,而且可以進行多種排列組合,這也許是裝飾模式的精髓吧。
下面僅僅是一部分**:
static void main(string args)
}class person
private string name;
public person(string name)
public virtual void show()
", name);}}
class finery : person
public override void show()}}
class tshirts : finery
}class bigtrouser : finery
特點:
(1) 裝飾物件和真實物件有相同的介面。這樣客戶端物件就可以和真實物件相同的方式和裝飾物件互動。
(2) 裝飾物件包含乙個真實物件的引用(reference)(例項中的person)。
(3) 裝飾物件接受所有來自客戶端的請求。它把這些請求**給真實的物件。
(4) 裝飾物件可以在**這些請求以前或以後增加一些附加功能。這樣就確保了在執行時,不用修改給定物件的結構就可以在外部增加附加的功能。在物件導向的設計中,通常是通過
繼承來實現對給定類的功能擴充套件。
優點:
1. decorator模式與繼承關係的目的都是要擴充套件物件的功能,但是decorator可以提供比繼承更多的靈活性。
2. 通過使用不同的具體裝飾類以及這些裝飾類的排列組合,設計師可以創造出很多不同行為的組合。
缺點:
1. 這種比繼承更加靈活機動的特性,也同時意味著更加多的複雜性。
2. 裝飾模式會導致設計中出現許多小類,如果過度使用,會使程式變得很複雜。
3. 裝飾模式是針對抽象元件(component)型別程式設計。但是,如果你要針對具體元件程式設計時,就應該重新思考你的應用架構,以及裝飾者是否合適。當然也可以改變component介面,增加新的公開的行為,實現「半透明」的裝飾者模式。在實際專案中要做出最佳選擇。
大話設計模式之裝飾模式
概念 動態給乙個物件新增額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。結構圖 解析 component類 定義乙個物件介面,可以給這些物件動態新增職責 方法 concretecomponent類 定義了乙個具體的物件,也可以給這個物件新增職責。decorator類 裝飾抽象類,繼承 com...
大話設計模式之裝飾模式
定義 分離類的職責,讓裝飾和主類分離,好處 利用setcomponent來物件進行包裝,這樣每個裝飾物件的實現就和如何使用這個物件分離開了,每個裝飾物件只關心自己的功能,不需要關心被如何新增到物件鏈中 有效的把類的核心職責和裝飾功能分開了,而且可以去除相關類中複雜的裝飾邏輯。例子 服飾類繼承人類,先...
大話設計模式之裝飾者模式
通過閱讀本篇文章,可以給喜歡使用繼承的開發人員提供一種新的思路。我們將會了解濫用繼承帶來的不良後果,同時也會介紹比繼承更合理的實現方式。利用繼承設計子類的行為,是在編譯時期靜態決定的,而且所有的子類都會繼承到相同的行為。然而,如果能夠利用組合的做法擴充套件物件的行為,就可以在執行時動態地進行擴充套件...