裝飾模式(Decorator):動態地給一個對象添加一些額外的職責,就增長功能來講,裝飾模式比生成子類更爲靈活。ide
裝飾模式結構圖:this
裝飾模式實現代碼:spa
/// <summary> /// 聲明一個Component的抽象基類 /// </summary> abstract class Component { public abstract void Operation(); } /// <summary> ///聲明一個具體的Component,繼承Component /// </summary> class ConcreteComponent : Component { public override void Operation() { Console.WriteLine("ConcreteComponent.Operation()"); } } /// <summary> /// 聲明一個抽象的裝飾類'Decorator' /// 並繼承Component /// </summary> abstract class Decorator : Component { protected Component component; //裝飾方法 public void SetComponent(Component component) { this.component = component; } //重寫 Operation 方法 public override void Operation() { if (component != null) { component.Operation(); } } } /// <summary> /// 聲明一個具體裝飾類A,繼承Decorator /// </summary> class ConcreteDecoratorA : Decorator { public override void Operation() { //一些功能擴展 Console.WriteLine("ConcreteDecoratorA.Operation()"); base.Operation(); } } /// <summary> /// 聲明一個具體裝飾類B,繼承Decorator /// </summary> class ConcreteDecoratorB : Decorator { public override void Operation() { //一些功能擴展 AddedBehavior(); Console.WriteLine("ConcreteDecoratorB.Operation()"); base.Operation(); } //裝飾類B自有方法 void AddedBehavior() { } } class Program { static void Main(string[] args) { ConcreteComponent c = new ConcreteComponent(); ConcreteDecoratorA d1 = new ConcreteDecoratorA(); ConcreteDecoratorB d2 = new ConcreteDecoratorB(); d1.SetComponent(c); d2.SetComponent(d1); d2.Operation(); Console.ReadKey(); } }
執行結果:3d
咱們能夠經過一個簡單是實例,還應用一下裝飾模式,好比如今有一種坦克,坦克有不少的型號和特點,有的具備紅外功能,有的具備GPS定位功能,經過使用裝飾模式,大大下降了子類的膨脹。code
//坦克基類 public class Tank { /// <summary> /// 射擊 /// </summary> public virtual void Shoot() { } } //T50 型坦克 public class T50Tank:Tank { public override void Shoot() { Console.WriteLine("T50 型號坦克射擊"); } } //T51型坦克 public class T51Tank : Tank { public override void Shoot() { Console.WriteLine("T51 型號坦克射擊"); } } //裝飾基類 public abstract class Decorator : Tank { protected Tank tank; //利用構造器進行裝飾 public Decorator(Tank tank) { this.tank = tank; } public override void Shoot() { if (tank != null) { tank.Shoot(); } } } //具備紅外功能 public class InfraRed : Decorator { public InfraRed(Tank tank) : base(tank) { } public override void Shoot() { Console.WriteLine("帶紅外功能"); base.Shoot(); } } //具備GPS功能 public class GPS : Decorator { public GPS(Tank tank) : base(tank) { } public override void Shoot() { Console.WriteLine("帶GPS功能"); base.Shoot(); } } class Program { static void Main(string[] args) { //聲明一個T50型坦克 Tank t50Tank = new T50Tank(); //給T50型坦克賦予紅外功能 InfraRed red = new InfraRed(t50Tank); //給T50型坦克賦予GPS功能 GPS gps = new GPS(red); gps.Shoot(); Console.ReadKey(); } }
執行結果:component