首页 > 代码库 > 命令模式

命令模式

命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持撤销额重做的操作

优势:

第一,能较容易地设计一个命令队列

第二,在需要的情况下,可以较容易地将命令记入日志

第三,允许接受请求的一方决定是否要否决请求

第四,可以容易的实现对请求的撤销和重做

第五,由于加进行的具体命令类不影响其他的类,因此增加新的具体命令很容易

第六,命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分隔开

在这类情况下需要用到命令模式,命令模式基本实现

  1 class Program  2     {  3         static void Main(string[] args)  4         {  5             //开店前的准备  6             Barbecuer boy = new Barbecuer();  7             Command bakeMuttonCommand1 = new BakeMuttonCommand(boy);  8             Command bakeMuttonCommand2 = new BakeMuttonCommand(boy);  9             Command bakeChickenWingCommand1 = new BakeChickenWingCommand(boy); 10             Waiter girl = new Waiter(); 11  12             //开门营业 顾客点菜 13             girl.SetOrder(bakeMuttonCommand1); 14             girl.SetOrder(bakeMuttonCommand2); 15             girl.SetOrder(bakeChickenWingCommand1); 16  17             //点菜完闭,通知厨房 18             girl.Notify(); 19  20             Console.Read(); 21  22         } 23     } 24  25     //服务员 26     public class Waiter 27     { 28         private IList<Command> orders = new List<Command>(); 29  30         //设置订单 31         public void SetOrder(Command command) 32         { 33             if (command.ToString() == "命令模式.BakeChickenWingCommand") 34             { 35                 Console.WriteLine("服务员:鸡翅没有了,请点别的烧烤。"); 36             } 37             else 38             { 39                 orders.Add(command); 40                 Console.WriteLine("增加订单:" + command.ToString() + "  时间:" + DateTime.Now.ToString()); 41             } 42         } 43  44         //取消订单 45         public void CancelOrder(Command command) 46         { 47             orders.Remove(command); 48             Console.WriteLine("取消订单:" + command.ToString() + "  时间:" + DateTime.Now.ToString()); 49         } 50  51         //通知全部执行 52         public void Notify() 53         { 54             foreach (Command cmd in orders) 55             { 56                 cmd.ExcuteCommand(); 57             } 58         } 59     } 60  61     //抽象命令 62     public abstract class Command 63     { 64         protected Barbecuer receiver; 65  66         public Command(Barbecuer receiver) 67         { 68             this.receiver = receiver; 69         } 70  71         //执行命令 72         abstract public void ExcuteCommand(); 73     } 74  75     //烤羊肉串命令 76     class BakeMuttonCommand : Command 77     { 78         public BakeMuttonCommand(Barbecuer receiver) 79             : base(receiver) 80         { } 81  82         public override void ExcuteCommand() 83         { 84             receiver.BakeMutton(); 85         } 86     } 87  88     //烤鸡翅命令 89     class BakeChickenWingCommand : Command 90     { 91         public BakeChickenWingCommand(Barbecuer receiver) 92             : base(receiver) 93         { } 94  95         public override void ExcuteCommand() 96         { 97             receiver.BakeChickenWing(); 98         } 99     }100 101     //烤肉串者102     public class Barbecuer103     {104         public void BakeMutton()105         {106             Console.WriteLine("烤羊肉串!");107         }108 109         public void BakeChickenWing()110         {111             Console.WriteLine("烤鸡翅!");112         }113     }

 

命令模式