動機(motivate):
上述描述的問題根源在於我們「過度地使用了繼承來擴充套件物件的功能」,由於繼承為型別引入的靜態物質,使得這種擴充套件方式缺乏靈活性;並且隨著子類的增多(擴充套件功能的增多),各種子類的組合(擴充套件功能組合)會導致更多子類的膨脹(多繼承)。
如何使「物件功能的擴充套件」能夠根據需要來動態地實現?同時避免「擴充套件功能的增多」帶來的子類膨脹問題?從而使得任何「功能擴充套件變化」所導致的影響將為最低?
意圖(intent):
動態地給乙個物件新增一些額外的職責。就增加功能來說,decorator模式相比生成子類更為靈活。
------《設計模式》gof
結構圖(struct):
適用性:
需要擴充套件乙個類的功能,或給乙個類增加附加責任。
需要動態地給乙個物件增加功能,這些功能可以再動態地撤銷。
需要增加由一些基本功能的排列組合而產生的非常大量的功能,從而使繼承關係變得不現實。
實現**:
namespace decorator
}
namespace decorator
public override void run()}}
namespace decorator
public override void run()}}
namespace decorator
public override void run()}}
namespace decorator
public override void shot()
public override void run()}}
namespace decorator
public override void shot()
public override void run()}}
namespace decorator
public override void shot()
public override void run()}}
namespace decorator
public override void shot()
public override void run()}}
class program
}
decorator模式的幾個要點:
通過採用組合、而非繼承的手法,decorator模式實現了在執行時動態地擴充套件物件功能的能力,而且可以
根據需要擴充套件多個功能。避免了單獨使用繼承帶來的「靈活性差"和"多子類衍生問題"。
component類在decorator模式中充當抽象介面的角色,不應該去實現具體的行為。而且decorator類對於component類應該透明---換言之component類無需知道decorator類,decorator類是從外部來擴充套件component類的功能。
decorator類在介面上表現為is-a component的繼承關係,即decorator類繼承了component類所且有的介面。但在實現上又表現has a component的組合關係,即decorator類又使用了另外乙個component類。我們可以使用乙個或者多個decorator物件來「裝飾」乙個component物件,且裝飾後的物件仍然是乙個component物件。
decorator模式並非解決」多子類衍生的多繼承「問題,decorator模式應用的要點在於解決「主體
類在多個方向上的擴充套件功能」------是為「裝飾」的含義。
decorator在.net(stream)中的應用:
可以看到, bufferedstream和cryptostream其實就是兩個包裝類,這裡的decorator模式省略了抽象裝飾角色(decorator),示例**如下:
class program
);
//擴充套件了緩衝的功能
bufferedstream buff = new bufferedstream(ms);
//擴充套件了緩衝,加密的功能
cryptostream crypto = new cryptostream(buff);}}
設計模式 裝飾模式
裝飾模式,動態地給乙個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。m 超級瑪麗 普通繼承模式實現 a 發鏢 能組合出七種功能 m1 a m4 a b b 變身 m2 b m5 a c c 無敵 m3 c m6 b c m7 a b m m1 a b 組合方法 new m2 m...
設計模式 裝飾模式
剛看了看設計模式,真是費了好多的腦細胞。想著想著就到了食堂。o o哈!正是長身體的時候 大神勿噴 一定要多吃點。於是我打了乙份公尺飯,然後又端著盛公尺飯的盤子買了乙份菜 看著還不是很夠,就又端著這個盤子買了一條最愛吃的魚。裝飾模式!五一要來了。回家轉轉,沒有小外甥的玩具怎麼行。於是我去超市,推著購物...
設計模式 裝飾模式
複習設計模式 裝飾模式 裝飾模式 在不修改已經存在的類的情況下,動態的新增新的功能,實現即插即用,開放關閉原則 public inte ce man public class batman implements man override public void killmonster public ...