說明:
在某一物件動態加上功能。
一層一層的將功能套上去,每一層執行的是不同的物件。
範例:
有一遊戲,有以下三個功能。
功能A:把玩家給我,我就能將玩家裝備寶劍
功能B:把玩家給我,我就能將玩家裝備護盾
功能C:把玩家給我,我就能將玩家裝備靴子
希望達成如下的效果
static void Main(string[] args) { // 玩家 Player player = new Player(); // 裝飾功能A (寶劍裝備) Decorator_A A = new Decorator_A(); A.SetPlayer(player); // 將"玩家"給功能A,增加寶劍裝備 // 裝飾功能B (護盾裝備) Decorator_B B = new Decorator_B(); B.SetPlayer(A); // 繼續給功能B,增加護盾裝備 // 裝飾功能C (靴子裝備) Decorator_C C = new Decorator_C(); C.SetPlayer(B); // 繼續給功能C,增加靴子裝備 // 開始一層一層執行裝備東西 C.Operation(); Console.ReadLine(); }執行結果:
玩家的裝備:
裝備了 寶劍,攻擊力+10
裝備了 護盾,防禦力+5
裝備了 靴子,速度+2
實現重點在於,
功能A、功能B、功能C 除了能接受玩家 player為處理對象,也能接受彼此為處理對象,才可以一層一層將功能疊加上去。
也就是「被裝飾者」和「裝飾功能」要繼承某一共同類別,並實做某一共同的方法,
我們將此共同類別抽出來當一個抽象類別,叫做 Component。
其餘程式碼
// 「元件」抽像類別,定義了「被裝飾者」和「裝飾功能」要實做的方法 abstract class Component { public abstract void Operation(); } // 玩家(被裝飾者),實做元件抽像介面 class Player : Component { public override void Operation() { Console.WriteLine("玩家的裝備:"); } } // 裝飾功能抽像類別,繼承「元件」抽像類別 abstract class Decorator : Component { protected Component component; // 設定玩家(也可理解成設定Component) public void SetPlayer(Component component) { this.component = component; } public override void Operation() { if (this.component != null) { this.component.Operation(); } } } // 裝飾功能A (寶劍裝備) class Decorator_A : Decorator { public override void Operation() { base.Operation(); // 執行原本玩家的功能 Console.WriteLine("裝備了 寶劍,攻擊力+10"); // 執行新功能 } } // 裝飾功能B (護盾裝備) class Decorator_B : Decorator { public override void Operation() { base.Operation(); // 執行原本玩家的功能 Console.WriteLine("裝備了 護盾,防禦力+5"); // 執行新功能 } } // 裝飾功能C (靴子裝備) class Decorator_C : Decorator { public override void Operation() { base.Operation(); // 執行原本玩家的功能 Console.WriteLine("裝備了 靴子,速度+2"); // 執行新功能 } }
相關連結:設計模式整理列表
沒有留言:
張貼留言