设计模式-命令模式

命令模式

一、概念

①什么是命令模式

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对讲求排队或记录请求日期,以及支持可撤销的操作。

②为什么使用命令模式

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();                                         //接收者实现烤鸡翅命令
        }       
    }
上一篇:一个 android 开机自动启动功能的测试


下一篇:【DB笔试面试702】在Oracle中,如何定时清理INACTIVE状态的会话?