设计模式-命令模式

简介: 设计模式-命令模式

命令模式

一、概念

①什么是命令模式

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

②为什么使用命令模式

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();                                         //接收者实现烤鸡翅命令
        }       
    }
目录
相关文章
|
7月前
|
设计模式 UED
二十三种设计模式:解锁软件开发的神器:命令模式与撤销重做功能
二十三种设计模式:解锁软件开发的神器:命令模式与撤销重做功能
173 0
|
3月前
|
设计模式 存储 算法
Java设计模式-命令模式(16)
Java设计模式-命令模式(16)
|
4月前
|
设计模式 存储 Java
【十二】设计模式~~~行为型模式~~~命令模式(Java)
文章详细介绍了命令模式(Command Pattern),这是一种对象行为型模式,用于将请求封装成对象,实现请求发送者与接收者的解耦,从而降低系统耦合度、提高灵活性,并支持命令的排队、记录、撤销和恢复操作。通过案例分析、结构图、时序图和代码示例,文章展示了命令模式的组成部分、实现方式和应用场景,并讨论了其优点、缺点和适用情况。
|
5月前
|
设计模式 JavaScript API
js设计模式【详解】—— 命令模式
js设计模式【详解】—— 命令模式
47 6
|
6月前
|
设计模式
命令模式-大话设计模式
命令模式-大话设计模式
|
6月前
|
设计模式 Java uml
必知的技术知识:JAVA【设计模式】命令模式
必知的技术知识:JAVA【设计模式】命令模式
30 0
|
6月前
|
设计模式 Java
Java设计模式之命令模式详解
Java设计模式之命令模式详解
|
6月前
|
设计模式
设计模式之命令模式
设计模式之命令模式
|
7月前
|
设计模式 Java 调度
【设计模式系列笔记】命令模式
命令模式是一种行为设计模式,它将请求封装成一个对象,从而允许使用不同的请求、队列或日志请求参数化客户端对象,同时支持撤销操作。
72 1
|
7月前
|
设计模式 Java 调度
小谈设计模式(24)—命令模式
小谈设计模式(24)—命令模式