命令模式(Command) 定義 命令模式(Command),將一個請求封閉為一個對象,從而使你可以用不同的請求對客戶進行參數化;對請求排除或記錄請求日誌,以及支持可撤銷的操作。 類圖 描述 Command:定義命令的統一介面; ConcreteCommand:Command介面的實現者,要執行的具 ...
命令模式(Command)
定義
命令模式(Command),將一個請求封閉為一個對象,從而使你可以用不同的請求對客戶進行參數化;對請求排除或記錄請求日誌,以及支持可撤銷的操作。
類圖
描述
Command:定義命令的統一介面;
ConcreteCommand:Command介面的實現者,要執行的具體命令;
Receiver:命令的實際執行者;
Invoker:命令的請求者,是命令模式中最重要的角色,用來對各個命令進行控制。
應用場景
顧客在餐館用餐的時候,首先由顧客點餐,服務員記錄顧客的點餐情況,然後服務員把訂單傳到後廚,廚師根據訂單把顧客點的餐烹飪好。
/// <summary> /// 廚師 /// </summary> public class Chef { public void CookBeef() { Console.WriteLine("大廚開始爆炒牛肉."); Console.WriteLine("爆炒牛肉出鍋."); } public void CookFish() { Console.WriteLine("大廚開始水煮魚."); Console.WriteLine("水煮魚出鍋."); } public void CookEggplant() { Console.WriteLine("大廚開始紅燒茄子."); Console.WriteLine("紅燒茄子出鍋."); } } public abstract class Command { public string Name { get; set; } public abstract void Cook(); } /// <summary> /// 爆炒牛肉 /// </summary> public class CookBeefCommand : Command { private Chef chef; public CookBeefCommand(Chef chef) { this.chef = chef; base.Name = "爆炒牛肉"; } public override void Cook() { this.chef.CookBeef(); } } /// <summary> /// 紅燒茄子 /// </summary> public class CookEggplantCommand : Command { private Chef chef; public CookEggplantCommand(Chef chef) { this.chef = chef; base.Name = "紅燒茄子"; } public override void Cook() { this.chef.CookEggplant(); } } /// <summary> /// 水煮魚 /// </summary> public class CookFishCommand : Command { private Chef chef; public CookFishCommand(Chef chef) { this.chef = chef; base.Name = "水煮魚"; } public override void Cook() { this.chef.CookFish(); } } /// <summary> /// 服務員 /// </summary> public class Waiter { private List<Command> commands; public Waiter() { this.commands = new List<Command>(); } public void SetOrder(Command command) { this.commands.Add(command); Console.WriteLine("增加訂單:" + command.Name); } public void CancelOrder(Command command) { this.commands.Remove(command); Console.WriteLine("取消訂單:" + command.Name); } public void Notify() { foreach (Command command in this.commands) { command.Cook(); } } }