裝飾模式總結:ide
裝飾模式是爲了已有功能動態得添加更多功能的一種方式。this
當系統須要新功能時,是向舊的類中添加新的代碼。這些新加的代碼一般裝飾了原有類的核心職責或主要行爲。spa
在主類中加入新的字段,新的方法和新的邏輯,從而增長了主類的複雜度,3d
而這些新加入的東西僅僅是知足一些只在某種特定狀況下才會執行的特殊行爲的須要。而裝飾模式卻提供了一個很是好的解決方案,code
它把每一個要裝飾的功能放在單獨的類中,並讓這個類包含它所要裝飾的對象,component
所以,當須要執行特殊行爲是,客戶代碼就能夠在運行是根據須要有選擇、按順序的使用裝飾功能包裝對象了。對象
裝飾模式把類中的裝飾功能從類中搬移去除,這樣能夠簡化原有的類。blog
有效的把類的核心職責和裝飾功能區分開了。並且能夠去除相關類中重複的裝飾邏輯。繼承
Component是定義一個對象接口,能夠給這些對象動態地添加職責。ConcreteComponent是定義了一個具體的對象,也能夠給這個對象添加一些職責。接口
Decorator 裝飾抽象類,繼承了Component,從外類來擴展Component類的功能,但對於Component來講,是無需知道Decorator的存在的。
至於ConcreteDecorator 就是具體的裝飾對象,起到給Component添加職責的功能。
/// <summary> /// 要裝飾的對象 /// </summary> public abstract class Component { /// <summary> /// 操做 /// </summary> public abstract void Operation(); } /// <summary> /// 具體要裝飾的對象 /// </summary> public class ConcreteComponent : Component { public override void Operation() { Console.WriteLine("\n具體對象的操做"); } } /// <summary> /// 裝飾類 /// </summary> public class Decorator : Component { protected Component component; /// <summary> /// 設置Component /// </summary> /// <param name="component"></param> public void SetComponent(Component component) { this.component = component; } /// <summary> /// 重寫Operation(), 實際執行的是Component的Operation() /// </summary> public override void Operation() { if (component != null) { component.Operation(); } } } /// <summary> /// 具體裝飾類A /// </summary> public class ConcreteDecoratorA : Decorator { /// <summary> /// 本類獨有的功能:添加狀態,以區別於ConcreteDecoratorB /// </summary> private string addState; public override void Operation() { ///首先運行原Component的Operation(),在執行本類的獨有的功能,如addState,至關於對原Comoponent進行了修飾 base.Operation(); addState = "New State"; Console.WriteLine("具體裝飾對象A的操做"); } } /// <summary> /// 具體裝飾類B /// </summary> public class ConcreteDecoratorB : Decorator { public override void Operation() { ///首先運行原Component的Operation(),在執行本類的獨有的功能,如addState,至關於對原Comoponent進行了修飾 base.Operation(); AddBehavior(); Console.WriteLine("具體裝飾對象B的操做"); } private void AddBehavior() { Console.WriteLine("AddBehavior"); } }
客戶端代碼:
static void Main(string[] args) { /* *裝飾的方式是:首先用ConcreteComponentA實例對象c, *而後用ConcreteDecoratorA的實例化對象a來裝飾對象c, *再用ConcreteComponentB的實例化對象b 來裝飾對象a, *最終執行b的Operation() */ ConcreteComponent c = new ConcreteComponent(); ConcreteDecoratorA a = new ConcreteDecoratorA(); ConcreteDecoratorB b = new ConcreteDecoratorB(); a.SetComponent(c); b.SetComponent(a); b.Operation(); Console.ReadLine(); }
結果:
*******************************************案例:小菜穿衣服************************************************************************
定義一個Person類:
public class Person { public Person() { } private string name; public Person(string name) { this.name = name; } public virtual void Show() { Console.Write("裝扮的是:{0}", name); } }
定義一個服飾類:
/// <summary> /// 服飾類:用來裝飾Person /// </summary> class Finery : Person { protected Person component; public void Decorate(Person component) { this.component = component; } public override void Show() { if (component != null) { // Console.WriteLine(component.ToString()); component.Show(); } } }
定義T恤服飾類:
/// <summary> /// 具體服飾類:T恤 /// </summary> class TShirts : Finery { public override void Show() { Console.Write("T恤 "); base.Show(); } }
定義服飾類褲子:
/// <summary> /// 具體服飾類:大褲子 /// </summary> class BigTrouser : Finery { public override void Show() { Console.Write("大褲子 "); base.Show(); } }
具體服飾類:皮鞋
/// <summary> /// 具體服飾類:皮鞋 /// </summary> class LeatherShoes : Finery { public override void Show() { Console.Write("皮鞋 "); base.Show(); } }
//。。。。其餘具體服飾類省略
客戶端調用:
Person xc = new Person("小菜"); Console.WriteLine("\n第一種裝扮"); TShirts ts = new TShirts(); BigTrouser bt = new BigTrouser(); LeatherShoes lhs = new LeatherShoes(); ts.Decorate(xc); bt.Decorate(ts); lhs.Decorate(bt); lhs.Show();
調用結果: