ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

设计模式-命令模式

2021-10-24 21:35:04  阅读:248  来源: 互联网

标签:void 模式 命令 Command receiver command 设计模式 public


命令模式

一、概念

①什么是命令模式

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

②为什么使用命令模式

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();                                         //接收者实现烤鸡翅命令
        }       
    }

标签:void,模式,命令,Command,receiver,command,设计模式,public
来源: https://blog.csdn.net/wangwei021933/article/details/120940978

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有