《大话设计模式》学习笔记19:命令模式

  

  

烧烤店点餐示例:

  

  实现1:

1.Receiver:

    public class Barbecuer
    {
        public void BakeMutton()
        {
            Console.WriteLine("烤羊肉串!");
        }
        public void BakeChickenWing()
        {
            Console.WriteLine("烤鸡翅!");
        }
    }

2.Command:

    public abstract class Command
    {
        protected Barbecuer receiver;
        public Command(Barbecuer receiver)
        {
            this.receiver = receiver;
        }
        public abstract void ExcuteCommand();
    }

3.ConcreteCommand:

    public class BakeMuttonCommand:Command
    {
        public BakeMuttonCommand(Barbecuer receiver)
            : base(receiver)
        {

        }
        public override void ExcuteCommand()
        {
            receiver.BakeMutton();
        }
    }
    public class BakeChikenWingCommand:Command
    {
        public BakeChikenWingCommand(Barbecuer receiver)
            :base(receiver)
        {

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

4.Invoker:

    public class Waiter
    {
        private Command command;
        public void SetOrder(Command command)
        {
            this.command = command;
        }
        public void Notify()
        {
            command.ExcuteCommand();
        }
    }

5.客户端代码:

    class Program
    {
        static void Main(string[] args)
        {
            Barbecuer barbecuer = new Barbecuer();

            Command bakeMuttonCommand1 = new BakeMuttonCommand(barbecuer);
            Command bakeMuttonCommand2 = new BakeMuttonCommand(barbecuer);
            Command bakeChickenWingCommand1 = new BakeChikenWingCommand(barbecuer);

            Waiter waiter = new Waiter();

            waiter.SetOrder(bakeMuttonCommand1);
            waiter.Notify();
            waiter.SetOrder(bakeMuttonCommand2);
            waiter.Notify();
            waiter.SetOrder(bakeChickenWingCommand1);
            waiter.Notify();
        }
    }

  实现2:增加命令队列、记录日志、否决请求、请求撤销

1.修改Invoker:

    public class Waiter
    {
        private IList<Command> commands = new List<Command>();//命令队列
        public void SetOrder(Command command)
        {
            if(command.ToString()=="Command.BakeChikenWingCommand")
            {
                Console.WriteLine("服务员:鸡翅没有了,请点别的烧烤。");//否决请求
            }
            else
            {
                commands.Add(command);
                Console.WriteLine("增加订单:" + command.ToString() + " 时间:" + DateTime.Now.ToString());//记录日志
            }
        }
        public void Notify()
        {
            foreach(var command in commands)
            {
                command.ExcuteCommand();
            }
        }
    }

2.修改客户端代码:

    class Program
    {
        static void Main(string[] args)
        {
            Barbecuer barbecuer = new Barbecuer();

            Command bakeMuttonCommand1 = new BakeMuttonCommand(barbecuer);
            Command bakeMuttonCommand2 = new BakeMuttonCommand(barbecuer);
            Command bakeChickenWingCommand1 = new BakeChikenWingCommand(barbecuer);

            Waiter waiter = new Waiter();

            waiter.SetOrder(bakeMuttonCommand1);
            //waiter.Notify();
            waiter.SetOrder(bakeMuttonCommand2);
            //waiter.Notify();
            waiter.SetOrder(bakeChickenWingCommand1);
            waiter.Notify();
        }
    }

  命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分割开。优点:

1.较容易设计一个命令队列;

2.在需要的情况下,可以较容易地将命令记入日志;

3.允许接收请求的一方决定是否要否决请求;

4.较容易实现对请求的撤销和重做;

5.由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易。

  敏捷开发的原则告诉我们,不要为代码添加基于猜测的、实际不需要的功能。如果不清楚一个系统是否需要命令模式,一般就不要着急去实现它,事实上,在需要的时候通过重构实现这个模式并不困难。只有在真正需要如撤销/恢复操作等功能时,把原来的代码重构为命令模式才有意义。

时间: 2024-09-30 00:19:22

《大话设计模式》学习笔记19:命令模式的相关文章

设计模式学习笔记之命令模式

命令模式 将“请求”封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持可撤销的操作. 说明: 1.命令模式将发出请求的对象和执行请求的对象解耦: 2.在被解耦的两者之间是通过命令对象进行沟通的.命令对象封装了接受者和一个或一组动作: 3.调用者通过调用命令对象的execute()发出请求,这会使得接受者的动作被调用: 4.调用者可以接受命令当做参数,甚至在运行时动态地进行: 5.命令可以支持撤销,做法事实现一个undo()方法来回到exexcute()被执行前的状态:

大话设计模式读书笔记--18.命令模式

定义 命令模式定义: 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作 比如: 吃烤串时, 客人点烤羊肉,烤鸡肉, 服务员记录下客人的点餐记录,然后通知厨师开始做 烤羊肉,烤鸡肉是请求对象;服务员是命令请求者;厨师是命令实现者 命令模式将功能(请求)封装成对象 目的 对命令请求者(Invoker)和命令实现者(Receiver)的解耦,方便对命令进行各种控制. 模式结构 代码实现 场景: 去饭店吃烤串 代码: 点击下载 特点和使用场

[大话设计模式]学习笔记——简单工厂模式

序 说好的每天进步一点点的,结果工作太忙,一直在加班,都没有学习新东西.我还要进BAT呢. 坚持每天学习新东西. 写代码时,意识到在代码结构上还是有点欠缺.赶紧补上. 纪录对设计模式的认识.小菜变大鸟.进攻BAT. 应用场景: 编写一个计算器控制台程序,要求输入两个数和运算符号,得到结果. 这本书使用C#写的.已有博主用JAVA写出来,参考:http://blog.csdn.net/ghsau/article/details/8163418 常见的做法: 写一个方法封装计算机的功能,我们只需传参

大话设计模式学习笔记——面向对象基础

前言 好记性不如烂"笔头"系列--大话设计模式学习笔记 目录 面向对象基础 面向对象基础 什么是类与实例 一切事物皆为对象,即所有的东西老师对象,对象就是可以看到.感觉到.听到.触摸到.尝到.或闻到的东西.准确地说,对象是一个自包含的实体,用一组可识别的特性和行为来标识.面向对象编程,英文叫 Object-Oriented Programming,其实就是针对对象来进行编程的意思.类就是具有相同属性和功能的对象的抽象集合.实例就是一个真实的对象.比如我们属于'人'类,而个人就是'人'类

大话设计模式读书笔记2——策略模式

策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类直接的耦合. UML 图: 根据<大话设计模式>——第二章 商场促销这个案例代码来简单的记录一下策略模式的使用方式: /// <summary> /// 现金收费抽象类 /// </summary> public abstract class CashSuper { /// <summary> ///

设计模式学习笔记--备忘录(Mamento)模式

写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式. 设计模式就是抽象出来的东西,它不是学出来的,是用出来的:或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以"模式专家"的角度来看,都是最佳的设计,不得不说是"最佳的模式实践",这

设计模式学习笔记--状态(State)模式

写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式. 设计模式就是抽象出来的东西,它不是学出来的,是用出来的:或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以"模式专家"的角度来看,都是最佳的设计,不得不说是"最佳的模式实践",这

设计模式学习笔记--迭代(Iterator)模式

写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式. 设计模式就是抽象出来的东西,它不是学出来的,是用出来的:或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以"模式专家"的角度来看,都是最佳的设计,不得不说是"最佳的模式实践",这

设计模式学习笔记--访问者(Visitor)模式

写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式. 设计模式就是抽象出来的东西,它不是学出来的,是用出来的:或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以"模式专家"的角度来看,都是最佳的设计,不得不说是"最佳的模式实践",这

大话设计模式学习笔记

大话设计模式笔记 1. 使用简单工厂模式(使用反射可以解决避免分支判断问题) 注重创建不同的对象 2. 使用策略模式处理 不同的时间应用不同的业务规则 3. 单一原则:一个类仅有一个变化的原因  发现职责并把职责分离 4. 开放-封闭原则:软件实体可以扩展但不能修改  对扩展开放 对更改封闭 开发人员对程序中呈频繁变化的那部分做出抽象 5. 依赖倒转原则: A.高层模块不应依赖底层模块.两者都应该依赖抽象. B.抽象不应该依赖细节,细节应该依赖于抽象.即针对接口编程, 不应针对实现编程. 里氏替