Command 和 Active Object 模式

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

public interface Command {public void do();
}

简单的Command

打印机工作流

开启/关闭继电器—RelayOnCommand、RelayOffCommand;

开启/关闭发动机—MotorOnCommand、MotorOffCommand;

开启/关闭离合器—ClutchOnCommand、ClutchOffCommand;

事务操作

另一个Command 模式的常见用法是创建和执行事务操作(Transactions)。当用户决定增加一个新雇员时,该用户必须详细指明成功创建一条雇员记录所需的所有信息。在使用这些信息前,系统需要验证这些信息语法和语义上的正确性。Command 对象存储了还未验证的数据,实现了实施验证的方法,并且实现了最后执行事务操作的方法。

validate() 方法检查所有数据并确保数据是有意义的。

execute() 方法用已经验证过的数据去更新数据库。

Active Object 模式

Active Object 模式是使用Command 模式的地方之一。这是实现多线程控制的一项古老的技术。

ActiveObjectEngine.java

import java.util.LinkedList;public class ActiveObjectEngine {/*** 命令链表.*/private LinkedList<Command> itsCommands = new LinkedList<>();/*** 添加命令.* @param c 命令.*/public void addCommand(Command c) {this.itsCommands.add(c);}/*** 运行.*/public void run() {while (!itsCommands.isEmpty()) {Command c = itsCommands.getFirst();itsCommands.removeFirst();System.out.println("--->Command.execute()");c.execute();}}
}

Command.java

public interface Command {public void execute();}

SleepCommandTest.java

import org.junit.Assert;
import org.junit.Test;public class SleepCommandTest {private boolean commandExecuted = false;@Testpublic void testSleep() {Command wakeupCommand = new Command() {@Overridepublic void execute() {commandExecuted = true;System.out.println("WakeUp...");}};ActiveObjectEngine engine = new ActiveObjectEngine();SleepCommand sleepCommand = new SleepCommand(wakeupCommand, engine, 1000);engine.addCommand(sleepCommand);long start = System.currentTimeMillis();engine.run();long stop = System.currentTimeMillis();long sleepTime = (stop - start);Assert.assertTrue("SleepTime " + sleepTime + " expected > 900", sleepTime > 900);Assert.assertTrue("SleepTime " + sleepTime + " expected < 1100", sleepTime < 1100);Assert.assertTrue("Command Executed", commandExecuted);}
}

SleepCommand.java

public class SleepCommand implements Command {/*** 唤醒命令.*/private Command wakeupCommand = null;/*** 引擎.*/private ActiveObjectEngine engine = null;/*** 休眠时间.*/private long sleepTime = 0l;/*** 开始时间.*/private long startTime = 0l;/*** 是否已开始.*/private boolean started = false;/*** 构造器.*/public SleepCommand(final Command wakeupCommand, final ActiveObjectEngine engine, final long milliseconds) {super();this.wakeupCommand = wakeupCommand;this.engine = engine;this.sleepTime = milliseconds;}/*** 执行.*/@Overridepublic void execute() {long currentTime = System.currentTimeMillis();if (!started) {started = true;startTime = currentTime;engine.addCommand(this);} else if ((currentTime - startTime) < sleepTime) {engine.addCommand(this);} else {engine.addCommand(wakeupCommand);}}}

和等待一个事件的多线程程序类比。当多线程程序中的一个线程等待一个事件时,它通常使用一些操作系统调用来阻塞自己直到事件发生。这里并没有阻塞,如果所等待的((currentTime - startTime) < sleepTime) 这个事件没有发生,它只是把自己放回到ActiveObjectEngine 中。

采用该技术的变体去构建多线程系统已经是一个很常见的实践。这种类型的线程被称为run-to-completion 任务(RTC),因为每个Command 实例在下一个Command 实例可以运行之前就运行完成了。RTC 意味着Command 实例不会阻塞。

DelayedCommand.java

public class DelayedCommand implements Command {/*** 延迟毫秒数.*/private long itsDelay;/*** 字符.*/private char itsChar;/*** 引擎.*/private static ActiveObjectEngine engine = new ActiveObjectEngine();/*** 是否停用.*/private static boolean stop = false;public static void main(String[] args) {engine.addCommand(new DelayedCommand(100, '1'));engine.addCommand(new DelayedCommand(300, '3'));engine.addCommand(new DelayedCommand(500, '5'));engine.addCommand(new DelayedCommand(700, '7'));Command stopCommand = new Command() {@Overridepublic void execute() {DelayedCommand.stop = true;}};engine.addCommand(new SleepCommand(stopCommand, engine, 2000));engine.run();}/*** 构造器.*/public DelayedCommand(long delay, char c) {super();itsDelay = delay;itsChar = c;}/*** 执行.*/@Overridepublic void execute() {System.out.print(itsChar);if (!stop) {delayAndRepeat();}}private void delayAndRepeat() {engine.addCommand(new SleepCommand(this, engine, itsDelay));}
}

Command 和 Active Object 模式相关推荐

  1. Java 高并发编程详解 17.0 Active Object 模式

    Active Object 模式 将接口的方法实现异步执行 结合Future(凭证)模式,流水线模式,代理模式等结合使用. 一般代码编写 编写接口方法类和实现类 /*** 方法接口命名*/ publi ...

  2. Java多线程编程模式实战指南一:Active Object模式(上)

    转载自:http://www.infoq.com/cn/articles/Java-multithreaded-programming-mode-active-object-part1 Active ...

  3. [置顶] Java多线程编程模式实战指南(一):Active Object模式(上)

    本文由黄文海首次发布在infoq中文站上:http://www.infoq.com/cn/articles/Java-multithreaded-programming-mode-active-obj ...

  4. Active Object 并发模式在 Java 中的应用--转载

    原文地址:http://www.ibm.com/developerworks/cn/java/j-lo-activeobject/ 本文主要从以下两个方面进行阐述: 使用 C++ 语言,来描述 Act ...

  5. Active Object pattern

    http://www.ibm.com/developerworks/cn/java/j-lo-activeobject/ 之所以叫, 主动对象, 区别于被动对象, 只能被动被别人调用的对象, 而主动对 ...

  6. java 实现Active Object思想

    我们一直在说并发编程,我们只知道JDK5有个并发编程包帮我们封装好了多线程下的复杂处理机制,这篇文章的重点不是说它的底层实现原理,只想说下并发包的编程模式思想,我以前一直在想这种思想来源于哪里,面向对 ...

  7. Active Object 设计模式

    一 接受异步消息的主动对象 Active是"主动"的意思,Active Object 是"主动对象"的意思,所谓主动对象就是指其拥有自己的独立线程,比如 Thr ...

  8. 轻松学习多线程-13-Active Object 模式

    目录 目录 Active Object 模式 实际案例 定义 测试 实现方式 UML & Code UML Code 系列导航 Active Object 模式 Active Object 模 ...

  9. Thinking In Design Pattern——Query Object模式

    什么是Query Object模式 Query Object的架构设计 Query Object在服务层的应用 测试 Query Object模式 Query Object:可以在领域服务层构造查询然 ...

最新文章

  1. 普通程序员如何逆袭,达到财富自由?
  2. Spring mvc环境搭建
  3. mysql auto_increment建表_在mysql表中创建一个ID auto_increment(在事实之后)
  4. springboot oauth2登录成功处理器_Spring Boot Security 整合 OAuth2 设计安全API接口服务...
  5. Request method 'GET' not supported解决方式
  6. 强制将IE8设置为IE7兼容模式来解析网页(转)
  7. CentOS 7主机名修改与查看命令详述
  8. cudaMemset的调用方式
  9. 基于JAVA+SpringMVC+Mybatis+MYSQL的大学生考勤管理系统及智能分析系统
  10. C# DataTable 按数字排序问题
  11. MMORPG大型游戏设计与开发(概述)updated
  12. 软件测试工程师工作总结
  13. 图像处理中饱和度、色调、对比度的定义
  14. 激光雷达三维检测包含哪些内容?
  15. http域名跳转到https域名
  16. 今天开始做战斗,回合制战斗代码实现第一篇补充,从头开始,简单的2d回合制游戏一些文档方面的知识
  17. 详解DeepSDF: Learning Continuous Signed Distance Functions for Shape Representation
  18. 文献阅读:Improving neural networks by preventing co-adaptation of feature detectors
  19. Javaweb开发一般步骤
  20. php代码审计课程笔记

热门文章

  1. 致力语言资源建设、常识推理的自然语言处理螺丝钉
  2. JavaWeb:XML总结
  3. 【秒懂】号称最为简明实用的Django上手教程
  4. ObjectArx R14-2007下载地址
  5. 学习笔记二:异步FIFO
  6. 有关 Lambda linq练习 有待整理
  7. Selenium-几种操作
  8. HP Unix vsftp服务配置
  9. Linux下使用iotop检测磁盘io使用情况
  10. MYSQL 定时任务