命令模式

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

解下来: 一家烧烤店,人们去那里吃烧烤,需要点菜的名字和传唤服务员告知厨师烧烤哪些东西。

   //烤肉串者
    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;
        }
        //执行命令
        public abstract void ExcuteCommand();
    }

    //具体命令
    //烤羊肉串命令
    public class BakeMuttonCommand : Command
    {
        public BakeMuttonCommand(Barbecuer receiver) : base(receiver) { }

        public override void ExcuteCommand()
        {
            receiver.BakeMutton();
        }
    }

    //烤鸡翅命令
    public class BakeChickenWingCommand : Command 
    {
        public BakeChickenWingCommand(Barbecuer receiver) : base(receiver) { }
        public override void ExcuteCommand()
        {
            receiver.BakeChickenWing();
        }
    }

    //服务员类
    public class Waiter 
    {
        private List<Command> orders = new List<Command>();

        //设置顶大
        public void SetOrder(Command command)
                {      //CommandPattern 是当命名空间的名字
            if (command.ToString() == "CommandPattern.BakeChickenWingCommand")
            {
                Console.WriteLine("服务员:鸡翅没了,清点别的烧烤");
            }
            else 
            {
                orders.Add(command);
                Console.WriteLine("增加订单:"+command.ToString()+"  时间:"+DateTime.Now.ToString());
            } 
        }

        //取消订单
        public void CancelOrder(Command command) 
        {
            orders.Remove(command);
        }

        //通知全部执行
        public void Notify() 
        {
            foreach (var item in orders)
            {
                item.ExcuteCommand();
            }
        }
    }

在main方法中调用:

 static void Main(string[] args)
        {
            Barbecuer boy = new Barbecuer();
            Command bakeMuttonCommand1 = new BakeMuttonCommand(boy);
            Command bakeMuttonCommand2 = new BakeMuttonCommand(boy);
            Command bakeChicken = new BakeChickenWingCommand(boy);

            Waiter girl = new Waiter();

            girl.SetOrder(bakeMuttonCommand1);

            girl.SetOrder(bakeMuttonCommand2);

            girl.SetOrder(bakeChicken);
            girl.Notify();  
            Console.ReadLine();
        }

这里写图片描述

想来这里大家还有些不是很清晰的地方,感觉理解不到位。

Created with Raphaël 2.1.0InvokerInvokerNewCommandNewCommandConcreteCommandConcreteCommandReceiverReceiver聚合关系继承实现该类
  public abstract class NewCommand
    {
        protected Receiver receiver;
        public NewCommand(Receiver receiver)
        {
            this.receiver = receiver;
        }
        //执行命令
        public abstract void ExcuteCommand();

    }

    public class Receiver
    {
        public void Action()
        {
            Console.WriteLine("执行请求");
        }
    }


    public class ConcreteCommand : NewCommand 
    {
        public ConcreteCommand(Receiver receiver) : base(receiver) { }

        public override void ExcuteCommand()
        {
            receiver.Action();
        }
    }

    public class Invoker 
    {
        private NewCommand command;
        public void SetCommand(NewCommand command) 
        {
            this.command = command;
        }
        public void ExcecuteCommand() 
        {
            command.ExcuteCommand();
        }
    }

  static void Main(string[] args)
        {
            Receiver r = new Receiver();
            NewCommand nc = new ConcreteCommand(r);
            Invoker i = new Invoker();
            i.SetCommand(nc);
            i.ExcecuteCommand();
            Console.ReadLine();
        }

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值