Command模式只是封装了一个没有任何变量的函数.

  • interface Command{ void Excute();}
  • 具有强烈的分解功能的味道.把函数层面的任务提升到了类的层面(一个类仅仅是为了完成一个函数,而且没有该函数外的任何成员).
  • 简单的Command
    • 事件驱动的系统.
      • Sensor(传感器).驱动者.只负责监听事件,并在事件发生后,调用绑定的Command的Excute方法.而不知道具体绑定的是什么样的Command.
      • Command只负责执行具体的命令逻辑.
      • 两者的绑定关系可以定义于系统主体之外(xml文件etc.)
  • 事务操作.
    • 解除了 从用户获取数据,验证并操作数据,业务对象本身的耦合关系.
    • 时间上解耦. 立即执行Validate,而把Transaction对放在一个List中,之后再执行.(用于DB中的夜间执行场景).
  • UnDo
    • 给Command接口添加一个Undo方法.
    • 很容易实现:知道如何去excute命令的代码和如何去undo命令的代码几乎类似.
  • Active Object模式
    • public interface CommandEngine
      {
      void AddCommand(Command cmd);
      } public class RTCEngine : CommandEngine
      {
      private List<Command> Commands; public RTCEngine()
      {
      this.Commands = new List<Command>();
      } public void AddCommand(Command cmd)
      {
      this.Commands.Add(cmd);
      } /// <summary>
      /// 执行Command队列中的所有命令,直至队列中不再含有任何的Command.
      /// </summary>
      public void Do()
      {
      while (this.Commands.Count > )
      {
      var cmd = Commands.First();
      this.Commands.Remove(cmd);
      cmd.Excute();
      }
      }
      }
       public interface Command
      {
      void Excute();
      } public class SleepCommand : Command
      {
      private long sleepTime; private CommandEngine engine;
      private Command callBack; private bool start;
      private long startTime; public SleepCommand(long timeout, CommandEngine engine, Command callBack)
      {
      this.sleepTime = timeout;
      this.engine = engine;
      this.callBack = callBack; this.start = false;
      } #region Command Members /// <summary>
      /// 执行,根据条件克隆自己或者添加CallBack命令到Engine中去.
      /// </summary>
      public void Excute()
      {
      long time = System.DateTime.Now.Ticks; //如果还未启动,那么启动自身,同时将自己添加到Engine队列末尾.
      if (!start)
      {
      this.start = true;
      this.startTime = time;
      engine.AddCommand(this);
      }
      //如果还没到唤醒时间,那么添加自己到Engine的队列末尾.
      if (time - startTime < sleepTime)
      {
      engine.AddCommand(this);
      }
      else
      {
      //已经到唤醒时间,将CallBack命令添加到Engine的队列末尾.
      engine.AddCommand(callBack);
      }
      } #endregion
      }
    • 阻塞式多线程:当一个线程等待一个事件时,它通常使用一些OS调用来阻塞自己直到事件发生.
    • RTC(run-to-completion):
      • 每个Command实例都在下一个Command实例可以运行之前就运行完成了.
      • 意味着Command实例不会阻塞.(如果等待的事件未到来,只是把自己放回到Engine中).
      • Command实例一经运行就一定得完成.所有的Command实例可以共享一个运行时堆栈.(减少内存使用量).

总结. Command模式具有极其的简洁性.但可以用于DB的Transaction操作,设备控制,多线程核心,GUI的do/undo管理.

其有不符合OO范式的味道.对函数的关注超过了类.

[Agile Software Development(Principles,Patterns,and Pracitices)]

Command模式的更多相关文章

  1. C++基础——模拟事务 (1)COMMAND模式

    =================================版权声明================================= 版权声明:原创文章 禁止转载  请通过右侧公告中的“联系邮 ...

  2. 敏捷软件开发(3)---COMMAND 模式 & Active Object 模式

    COMMAND 模式 command模式非常简单,简单到你无法想象的地方. public interface Command { void execute(); } 这就是一个command模式的样子 ...

  3. 条款19 command 模式与好莱坞法则

    当一个函数对象被当做回调时候,就是一个command模式的实例 什么是回调? 回调就是框架知道什么时候干一些事情,但是具体干什么,或许框架一无所知(因为回调函数不是他设计的),而用户则知道发生一个特定 ...

  4. 开发设计模式(一)Command模式

    Command定义 将来自客户端的请求传入一个对象,无需了解这个请求激活的 动作或有关接受这个请求的处理细节. 这是一种两台机器之间通讯联系性质的模式,类似传统过程语 言的 CallBack功能. 优 ...

  5. Command 模式

    Command 模式通过将请求封装到一个对象(Command)中,并将请求的接受者存放具体的 ConcreteCommand 类中(Receiver)中,从而实现调用操作的对象和操作的具体实现 者之间 ...

  6. 【行为型】Command模式

    命令模式是指将用户的请求封装成(命令)对象,从而可将用户不同的请求进行参数化.对这些请求排序或记录请求日志.以及支持回滚恢复操作.记得以前刚开始使用Photoshop时,就发现它的操作历史记录面板特别 ...

  7. [译]使用Command模式和MediatR简化你的控制器

    原文 你希望保持你的controller足够简单. 你的controller越来越臃肿,你听说command模式是一个给controller瘦身的解决方案. 但是你不知道command模式是否适合你的 ...

  8. Java设计模式(22)命令模式(Command模式)

    Command模式是最让我疑惑的一个模式,我在阅读了很多代码后,才感觉隐约掌握其大概原理,我认为理解设计模式最主要是掌握起原理构造,这样才对自己实际编程有指导作用.Command模式实际上不是个很具体 ...

  9. Xwork概况 XWork是一个标准的Command模式实现,并且完全从web层脱离出来。Xwork提供了很多核心功能:前端拦截机(interceptor),运行时表单属性验证,类型转换,强大的表达式语言(OGNL – the Object Graph NavigationLanguage),IoC(Inversion of Control反转控制)容器等。 ----------------

    Xwork概况 XWork是一个标准的Command模式实现,并且完全从web层脱离出来.Xwork提供了很多核心功能:前端拦截机(interceptor),运行时表单属性验证,类型转换,强大的表达式 ...

随机推荐

  1. C#将Enum枚举映射到文本字符串

    介绍 当将以前的C代码移植到C#中时,我快发疯了,因为有很多的数组需要将常量映射到字符串.当我在寻找一个C#的方法来完成的时候,我发现了一个自定义属性和映射的方法. 如何使用代码? 对每一个enum枚 ...

  2. css基本知识框架(转)

    css基本知识框架: 1.css样式表的基本概念 2.样式表基本类型-----1.内嵌样式 2.内联样式3.链入外部样式表4.导入外部?式 3.样式表配置方法 4.字体属性----1.font-fam ...

  3. 新创建的项目利用git添加远程仓库

    git initgit remote add origin https:// //git账号中的网址 (git remote //可以查询添加的远程仓库) git add . //添加刚刚导入的整个工 ...

  4. HashedWheelTimer 原理

    HashedWheelTimer 是根据 Hashed and Hierarchical Timing Wheels: Data Structuresfor the Efficient Impleme ...

  5. Oracle 索引<七>

    Oracle 索引 管理索引-原理介绍  介绍 索引是用于加速数据存取的数据对象.合理的使用索引可以大大降低 i/o 次数,从而提高数据访问性能.索引有很多种我们主要介绍常用的几种: 为什么添加了索 ...

  6. [python] 线程

    来源:田飞雨 链接:http://www.jianshu.com/p/12cd213a93bf 虽然python中由于GIL的机制致使多线程不能利用机器多核的特性,但是多线程对于我们理解并发模型以及底 ...

  7. unreal3的viewport和client

    名字里带viewport/client的类不少,以及相关的类: FViewportFrame.FViewport FViewportClient/UScriptViewportClient/UGame ...

  8. php protected封装

    <?//父类class father{ public function a(){     echo 'father->a()'.'<br>';  echo "func ...

  9. 实现毛玻璃模糊效果/DRNRealTimeBlur

    四种方法:1.美工出图  2.coreImage框架,高斯效果 3.ToolBar,覆盖在view上边 //1.添加图片 self.imageView.image = [UIImage imageNa ...

  10. 无需部署的轻量级数据库—SQLLite,使用Demo

    当有程序需要保存轻量数据,而又烦躁序列化到本地的不便,轻量级数据库—SQLLite是一个很好的选择,只需引用System.Data.SQLite.DLL,无需部署数据库,便可像拥有数据库一样保存数据, ...