命令模式:将一个请求封装成一个对象,然后可以用不同的请求对客户进行参数化,(烧烤店点菜,烤肉:服务员根据用户的需要生成一个点菜单,服务员根据点菜单的内容下达命令给烧烤师傅) #region 命令模式 class Barbecuer { public void BakeChickenAction(int num) { Console.WriteLine("{0}个鸡翅烤好了!",num); } public void BakeMuttonAction(int num) { Console.WriteLine("{0}个羊肉串烤好了!",num); } } abstract class BakeCommand { public int Num; protected Barbecuer receiver; public BakeCommand(Barbecuer receiver,int num) { this.receiver = receiver; this.Num = num; } public abstract void ExecuteCommand(); } class BakeChickenCommand : BakeCommand { public BakeChickenCommand(Barbecuer receiver,int num) : base(receiver,num) { } public override void ExecuteCommand() { receiver.BakeChickenAction(Num); } } class BakeMuttonCommand : BakeCommand { public BakeMuttonCommand(Barbecuer receiver,int num) : base(receiver,num) { } public override void ExecuteCommand() { receiver.BakeMuttonAction(Num); } } class Waiter { List<BakeCommand> orders = new List<BakeCommand>(); BakeCommand cancelCommand; //被取消的命令 public void SetOrder(BakeCommand cmd) { if (cmd.ToString() == "SimpleFactory.BakeMuttonCommand") { //Console.WriteLine("服务员:羊肉串已经卖完了 {0}",DateTime.Now.ToString()); orders.Add(cmd); Console.WriteLine("服务员:{2}个{0},{1}", cmd.ToString() == "SimpleFactory.BakeMuttonCommand" ? "烤羊肉串" : cmd.ToString(), DateTime.Now.ToString(),cmd.Num); } else { orders.Add(cmd); Console.WriteLine("服务员:{2}个{0},{1}", cmd.ToString() == "SimpleFactory.BakeChickenCommand" ? "烤鸡翅" : cmd.ToString(), DateTime.Now.ToString(),cmd.Num); } } private bool GetPredicate(BakeCommand cmd) { if (cmd==cancelCommand) return true; else return false; } public void CancelOrder(BakeCommand cmd) { cancelCommand = cmd; orders.RemoveAll(GetPredicate); if (cmd.ToString() == "SimpleFactory.BakeMuttonCommand") { Console.WriteLine("取消订单:{2}个{0},{1}", cmd.ToString() == "SimpleFactory.BakeMuttonCommand" ? "烤羊肉串" : cmd.ToString(), DateTime.Now.ToString(),cmd.Num); } else { Console.WriteLine("取消订单:{2}个{0},{1}", cmd.ToString() == "SimpleFactory.BakeChickenCommand" ? "烤鸡翅" : cmd.ToString(), DateTime.Now.ToString(),cmd.Num); } } public void Notify() { foreach (BakeCommand cmd in orders) { cmd.ExecuteCommand(); } } } #endregion class Program { static void Main(string[] args) { #region 命令模式 Console.WriteLine("命令模式效果演示:"); Barbecuer bar = new Barbecuer(); BakeCommand bcChicken = new BakeChickenCommand(bar,5); BakeCommand bcMutton1 = new BakeMuttonCommand(bar,8); BakeCommand bcMutton2 = new BakeMuttonCommand(bar,10); Waiter wt = new Waiter(); wt.SetOrder(bcChicken); wt.SetOrder(bcMutton1); wt.SetOrder(bcMutton2); wt.CancelOrder(bcMutton1); wt.Notify(); #endregion } }