動態的給一個對象添加一些額外的職責,就增長功能來講,裝飾模式比生產子類更加靈活——《大話設計模式》。【結構型模式】設計模式
1.結構類的實現:ide
Component定義一個對象接口,能夠給這些對象動態的添加職責。性能
ConcreteComponent定義具體的對象,能夠給這個對象添加一些職責。學習
/// <summary> /// 元件類 /// 被裝飾的抽象對象 /// </summary> public abstract class Component { /// <summary> /// 對象的抽象操做 /// </summary> public abstract void Operation(); } /// <summary> /// 具體元件 /// </summary> public class ConcreteComponent : Component { /// <summary> /// 對象的具體操做 /// </summary> public override void Operation() { Console.WriteLine("元件具體操做!"); } }
Decorator,裝飾抽象類,繼承Component,從外類來擴展Component的功能,但對於Component來講,無需知道Decorator的存在。this
/// <summary> /// 裝飾類 /// 裝飾操做的抽象類 /// </summary> public abstract class Decorator : Component { /// <summary> /// 被裝飾的元件 /// </summary> protected Component component; /// <summary> /// 設置元件 /// </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> /// 裝飾A獨有的屬性 /// 區別其餘裝飾類 /// </summary> private string addedState; /// <summary> /// 裝飾類B的操做 /// </summary> public override void Operation() { base.Operation(); addedState = "我是裝飾A"; Console.WriteLine(addedState); } } /// <summary> /// 具體裝飾類B /// </summary> public class ConcreteDecoratorB : Decorator { /// <summary> /// 裝飾類B的獨有操做 /// 區別其餘裝飾類 /// </summary> private void AddedBehavior() { Console.WriteLine("裝飾類B的獨有操做"); } /// <summary> /// 裝飾類B的操做 /// </summary> public override void Operation() { base.Operation(); AddedBehavior(); Console.WriteLine("裝飾類B的操做"); } }
客戶端spa
ConcreteComponent cc = new ConcreteComponent(); Decorator cda = new ConcreteDecoratorA(); Decorator cdb = new ConcreteDecoratorB(); cda.SetComponent(cc); cdb.SetComponent(cda); cdb.Operation(); Console.WriteLine("*********************************");
執行結果設計
2.裝飾器模式之DOTA英雄學習技能調試
英雄每次上級,會獲得一個技能點學習技能。具體的英雄就至關於【ConcreteComponent】,技能欄就至關於【Decorator】,具體的技能就至關於【ConcreteDecoratorA】,【ConcreteDecoratorB】code
英雄component
/// <summary> /// 英雄抽象類 /// </summary> public abstract class Hero { public string HeroName; public abstract void LearnSkill(); } /// <summary> /// 具體英雄 /// 劍聖 /// </summary> public class JUGG : Hero { public JUGG(string heroName) { HeroName = heroName; } public override void LearnSkill() { Console.WriteLine(HeroName + "學習了以上技能"); } }
技能
/// <summary> /// 技能欄,繼續學技能 /// </summary> public abstract class SkillDecorator : Hero { private Hero hero; public string skillName; public SkillDecorator(Hero hero, string skillName) { this.hero = hero; this.skillName = skillName; } public override void LearnSkill() { if (hero != null) { hero.LearnSkill(); } } } /// <summary> /// 具體的技能Q /// </summary> public class QSkill : SkillDecorator { public QSkill(Hero hero, string skillName) : base(hero, skillName) { } public override void LearnSkill() { LearnQSkill(); base.LearnSkill(); } /// <summary> /// Q 技能 特性 /// </summary> public void LearnQSkill() { Console.WriteLine("學習了{0}技能!", skillName); } } /// <summary> /// 具體的技能W /// </summary> public class WSkill : SkillDecorator { public WSkill(Hero hero, string skillName) : base(hero, skillName) { } public override void LearnSkill() { LearnWSkill(); base.LearnSkill(); } /// <summary> /// W 技能 特性 /// </summary> public void LearnWSkill() { Console.WriteLine("學習了{0}技能!", skillName); } }
客戶端
Hero jugg = new JUGG("劍聖"); SkillDecorator q = new QSkill(jugg, "劍刃風暴"); SkillDecorator w = new WSkill(q, "治療守衛"); w.LearnSkill();
結果
請多多指教~