命令模式
一、概念
①什么是命令模式
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对讲求排队或记录请求日期,以及支持可撤销的操作。
②为什么使用命令模式
1.能够容易的将命令写入日志,加入新的具体命令类比较容易2.可以容易的实现对请求的撤销和重做。3.将一个操作的对象与知道怎么执行一个操作的对象分开。
③如何使用命令模式
在具体命令类的方法里面调用执行者,而在请求者的方法里面调用具体命令类。实现行为请求者与行为实现者之间的解耦。
类图
实例
类图
代码
客户端
static void Main(string[] args) { //开店前的准备 :烤肉厨师,烤肉菜单,服务员 Barbecuer boy = new Barbecuer(); //通过Barbecuer类实例化一个boy对象,即烤肉者 Command bakeMuttonCommand1 = new BakeMuttonCommand(boy); // 多态的体现:实例化烤羊肉串对象 Command bakeMuttonCommand2 = new BakeMuttonCommand(boy); //通过command类,实例化一个烤羊肉串命令2对象,并将值赋予给对象 Command bakeChickenWingCommand1 = new BakeChickenWingCommand(boy); //通过command类,实例化一个烤翅命令1对象 Waiter girl = new Waiter(); //实例化一个服务员 //开门营业 顾客点菜 girl.SetOrder(bakeMuttonCommand1); //设置订单,服务员接受命令 girl.SetOrder(bakeMuttonCommand2); //记录所有菜点 girl.SetOrder(bakeChickenWingCommand1); //点菜完闭,通知厨房 girl.Notify(); //服务员一次性通知烤肉厨师执行 Console.Read(); }
服务员
public class Waiter { //private Command command; 设置订单 //public void SetOrder(Command command ) //{ // this.command = command; //} 通知执行 //public void Notify() //{ // command.ExcuteCommand(); //} //--------------------------------------------------------------------------- private IList<Command> orders = new List<Command >();//增加存放具体命令得容器 //设置订单 public void SetOrder(Command command ) { if (command.ToString() =="命令模式_烤羊肉串02.BakeMuttonCommand " ) //如果命令为烤翅命令 { Console.WriteLine("服务员:鸡翅没有了,请点别的烧烤"); //服务员告知没有鸡翅了 } else // //将命令添加到总订单中 { orders.Add(command); Console.WriteLine("增加订单:" + command.ToString() + "时间:"+DateTime.Now.ToString()); //记录具体时间 } } //取消订单 public void CancelOrder(Command command) { orders.Remove(command); Console.WriteLine("取消订单:" + command.ToString() + "时间:" + DateTime.Now.ToString()); } //通知全部执行 public void Notify() //根据用户点好得烧烤订单通知厨房制作 { foreach (Command cmd in orders ) //遍历整个订单,并通知接受者 { cmd.ExcuteCommand(); } } }
烧烤者
//烤羊肉串者 public class Barbecuer { //烤羊肉串 public void BakeMutton() { Console.WriteLine("烤羊肉串"); } //烤鸡翅 public void BakeChickenWing() { Console.WriteLine("烤鸡翅"); } }
抽象命令类
//抽象命令 public abstract class Command { protected Barbecuer receiver; //引用烤肉者,因为命令是烧烤者的 public Command (Barbecuer receiver ) { this.receiver = receiver; //命令构造函数,所传参数为烧烤者 } //执行命令 abstract public void ExcuteCommand(); //创建一个抽象执行命令方法 }
具体命令类
//烤羊肉命令类 class BakeMuttonCommand:Command //烤羊类命令继承命令 { public BakeMuttonCommand (Barbecuer receiver ):base(receiver ) //子类构造函数与父类构造函数参数的引用 { } public override void ExcuteCommand() //重写父类中的执行命令方法 { receiver.BakeMutton(); //接受者只想烤羊肉命令 } } //烤鸡翅命令 class BakeChickenWingCommand:Command //烤鸡翅类命令继承命令 { public BakeChickenWingCommand (Barbecuer receiver ):base(receiver ) //构造函数的继承 { } public override void ExcuteCommand() //重写父类只想命令方法 { receiver.BakeChickenWing(); //接收者实现烤鸡翅命令 } }