標籤:public rri err receive key ati 來源 count 維護
C#命令模式 圖片來源<設計模式之禪>
按所示 Receiver是實際幹活的實現代碼就在這個模組中 , Command 是抽象父類,ConcreteCommand是繼承Command的類型 抽象的父類中含有Receiver類 用於子類調用其方法,即子類的Execute就是調用的Receiver中實際代碼,Invoker就是為了維護
comand方法
實際代碼如
1 /// <summary> 2 /// 實作類別 3 /// </summary> 4 public class Barbecuer 5 { 6 7 public void BakeMutton() 8 { 9 10 Console.WriteLine("烤羊肉串");11 }12 13 public void BakeChickenWing()14 {15 16 Console.WriteLine("烤雞翅");17 }18 }
實作類別即 Receiver 代碼
//實際代碼 public abstract class Command {//實現代碼的類 protected Barbecuer receiver; public Command(Barbecuer receiver) { this.receiver = receiver; }//實現的方法 abstract public void ExcuteCommand(); } public class BakeChickenWingCommand : Command { public BakeChickenWingCommand(Barbecuer receiver) : base(receiver) { } public override void ExcuteCommand() { receiver.BakeChickenWing(); } } public class BakeMuttonCommand : Command { public BakeMuttonCommand(Barbecuer receiver) : base(receiver) { } public override void ExcuteCommand() { receiver.BakeMutton(); } }
上面為父類與子類 即Command ,ConcreteCommand 模組
再來就是維護類 用於維護command方法
public class Waiter { Queue<Command> queue = new Queue<Command>(); public void SetCommand(Command command) { queue.Enqueue(command); } public void Notify() { while (queue.Count > 0) { Command command = queue.Dequeue(); command.ExcuteCommand(); } } }
後面調用代碼
class Program { static void Main(string[] args) { //產生維護的類 Waiter waiter = new Waiter(); //真正實現代碼的類 Barbecuer barecuer = new Barbecuer(); //傳入到執行類裡面去 Command commandwing = new BakeChickenWingCommand(barecuer); //傳入執行的子類 讓子類執行代碼 waiter.SetCommand(commandwing); waiter.SetCommand(commandwing); waiter.SetCommand(commandwing); waiter.Notify(); Command command = new BakeMuttonCommand(barecuer); waiter.SetCommand(command); waiter.SetCommand(command); waiter.Notify(); Console.ReadKey(); } }
命令模式 用出就是維護命令的列隊,有需要的時候就把命令加入日誌,支援撤銷與重做 撤銷就要在waiter 類 即Invoker模組中進行維護判斷是否把command中的某個子類加入到執行列表中
C# 命令模式