命令模式:將一個請求封裝為一個對象,從而是你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日誌,以及支持可撤銷的操作。 命令模式有如下優點:1.它能較容易地設計一個命令隊列;2.在需要的情況下,可以較容易地將命令記入日誌;3.允許接收請求的一方決定是否要否決請求;4.可以容易地實現請求的撤銷和 ...
命令模式:將一個請求封裝為一個對象,從而是你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日誌,以及支持可撤銷的操作。
命令模式有如下優點:1.它能較容易地設計一個命令隊列;2.在需要的情況下,可以較容易地將命令記入日誌;3.允許接收請求的一方決定是否要否決請求;4.可以容易地實現請求的撤銷和重做;5.由於加進新的具體命令類不影響其他類,因此增加新的具體命令類很容易;6.把請求的一個操作的對象與知道怎麼執行一個操作的對象分割開來。
下麵的例子是關於烤雞翅和烤羊肉串的實例。
代碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 設計模式之命令模式 { public class barbecuer { public void doSheep() { Console.WriteLine("烤羊肉串!"); } public void doChicken() { Console.WriteLine("烤雞翅!"); } } public abstract class command { public barbecuer myBar; public void setBarbecuer(barbecuer bar) { this.myBar = bar; } public abstract void excuteCommand(); } public class sheepCommand : command { public override void excuteCommand() { myBar.doSheep(); } } public class chickenCommand : command { public override void excuteCommand() { myBar.doChicken(); } } public class waiter { List<command> comds = new List<command>(); public void Add(command c) { comds.Add(c); } public void Remove(command c) { comds.Remove(c); } public void doAction() { foreach (command c in comds) { c.excuteCommand(); } } } class Program { static void Main(string[] args) { sheepCommand spc1 = new sheepCommand(); sheepCommand spc2 = new sheepCommand(); chickenCommand ckc = new chickenCommand(); barbecuer bar = new barbecuer(); waiter wt = new waiter(); spc1.setBarbecuer(bar); spc2.setBarbecuer(bar); ckc.setBarbecuer(bar); wt.Add(spc1); wt.Add(ckc); wt.Add(spc2); wt.doAction(); wt.Remove(spc2); wt.doAction(); Console.ReadKey(); } } }
運行結果: