Command 和 Active Object 模式

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));}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/497152.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

成员函数指针作为参数是,静态函数和非静态函数的区别

成员函数指针作为参数时&#xff0c;静态函数和非静态函数的区别 举个 QT 的例子&#xff08;没学过QT的也不要紧&#xff0c;这适用于学习C的同学&#xff09;&#xff0c;当我有两个类&#xff0c;Teacher 类和 Student 类。现在有一个场景就是&#xff0c;Teacher 类会发出…

谷歌云TPU服务正式全面开放:「AlphaGo背后的芯片」进入商用化

来源&#xff1a;机器之心概要&#xff1a;作为科技巨头的谷歌早已把这种高度定制化产品应用在了自己的服务器中&#xff0c;而本周一&#xff0c;谷歌宣布其他公司马上也将可以享受新型芯片带来的计算服务了。2016 年 5 月&#xff0c;谷歌向世人发布了一款特别的机器学习专属…

波士顿动力新年视频第一发,机器人狗能为朋友开门了!

来源&#xff1a;36氪概要&#xff1a;波士顿动力公司的那只黄色机器人狗SpotMini&#xff0c;你还记得吗&#xff1f;波士顿动力公司的那只黄色机器人狗SpotMini&#xff0c;你还记得吗&#xff1f;它上一次亮相是在去年11月&#xff0c;当时它还在一片后院的草地上恣意奔跑。…

Makefile详解——从入门到精通

转自ChinaUnix&#xff0c;作者gunguymadman&#xff0c;陈皓。链接地址&#xff1a;http://www.chinaunix.net/jh/23/408225.html 陈皓 CSDN 博客&#xff1a;http://blog.csdn.net/haoel/article/details/2886 http://blog.csdn.net/ruglcc/article/details/7814546 写的相…

是时候不把智能手机叫做电话了:移动AI时代来临!

来源&#xff1a;EET电子工程专辑概要&#xff1a;全新的iPhone X集成了用于人脸识别的神经引擎&#xff0c;但这仅仅是一个开始。全新的iPhone X集成了用于人脸识别的神经引擎&#xff0c;但这仅仅是一个开始。嵌入式神经引擎和专用智能处理器在边缘设备上实现了人工智能(AI)&…

拥抱AI大趋势,ARM发布两款AI芯片架构

来源&#xff1a;量子位概要&#xff1a;ARM发布了两款针对移动终端的AI芯片架构&#xff0c;物体检测&#xff08;Object Detection&#xff0c;简称OD&#xff09;处理器和机器学习&#xff08;Machine Learning&#xff0c;简称ML&#xff09;处理器。今天&#xff0c;ARM发…

Ubuntu 安装 mysql、sqlite3、postgresql

NAVICAT 官网&#xff1a;http://www.navicat.com.cn/products NAVICAT16 PREMIUM NAVICAT16 &#xff1a;http://zzzzzz.me/post-73329.html Xmanager &#xff1a;https://www.xshellcn.com/ 1、Ubuntu 安装 mysql ubuntu上安装MySQL非常简单只需要几条命令就可以完成。 1…

牡丹园

其实从少林寺去洛阳非常近&#xff0c;当时想赶当天晚上的火车去另一个地方&#xff0c;所以从少林寺又回到郑州火车站&#xff0c;结果没有票&#xff0c;于是取消了。决定在郑州住一晚第二天去洛阳。 看到洛阳路边隔断种的都是这种植物&#xff0c;星星点点很是好看&#xff…

Singleton 和 Monostate 模式

Singleton 和 Monostate 模式 怎样才能使得两个实例表现得像一个对象呢&#xff1f;很简单&#xff0c;只要把所有的变量都变成静态变量即可。 public class Monostate {private static int itsX 0;public Monostate() {}public void setX(final int x) {itsX x;}public int…

十张图看懂未来大数据世界

作者&#xff1a;薄云借智来源&#xff1a;钱塘江大数据随着互联网云时代的来临&#xff0c;大数据与云计算就像一个硬币的正反两面&#xff0c;势必会影响到社会生活的方方面面&#xff0c;改变我们现有的规则和秩序。伴随着大数据与云计算产业的不断发展&#xff0c;未来到底…

MediaWiki初探:安装及使用入门

来源&#xff1a;http://blog.csdn.net/wangnan537/article/details/37743497 MediaWiki是著名的开源wiki引擎&#xff0c;全球最大的wiki项目维基百科(百科词条协作系统)是使用MediaWiki的成功范例&#xff0c;MediaWiki的最大作用在于对知识的归档&#xff0c;可用于构建企业…

科学释梦——意识窗口在记忆模块间的穿越

作者&#xff1a;谢平 中国科学院大学教授 唐代诗人李白曾说&#xff0c;“浮生若梦&#xff0c;为欢几何”&#xff0c;将人生喻为短暂的梦幻。有些人生如梦&#xff0c;有些梦若人生&#xff0c;还有梦想人生......梦——五彩缤纷&#xff0c;诡异神奇&#xff0c;我们每晚都…

linux 内核与用户空间通信之netlink使用方法

Linux中的进程间通信机制源自于Unix平台上的进程通信机制。Unix的两大分支AT&T Unix和BSD Unix在进程通信实现机制上的各有所不同&#xff0c;前者形成了运行在单个计算机上的System V IPC&#xff0c;后者则实现了基于socket的进程间通信机制。同时Linux也遵循IEEE制定的P…

超级智能城市:更高质量的幸福社会

报告下载链接:https://pan.baidu.com/s/1oAmRK4U 密码:t9qb未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能&#xff0c;互联网和脑科学交叉研究机构。由互联网进化论作者&#xff0c;计算机博士刘锋与中国科学院虚拟经济与数据科学研究中心石勇、刘颖教授创建…

python网络编程——IO多路复用之epoll

来源&#xff1a;http://www.cnblogs.com/maociping/p/5132583.html 1、内核EPOLL模型讲解 此部分参考http://blog.csdn.net/mango_song/article/details/42643971博文并整理 首先我们来定义流的概念&#xff0c;一个流可以是文件&#xff0c;socket&#xff0c;pipe等可以进行…

高精度定位!“天地一体”基础设施助中国北斗在商用领域“弯道超车”

来源&#xff1a;上观概要&#xff1a;从2007年第一颗北斗导航卫星成功发射&#xff0c;到2018年2月12日第二十八、二十九颗卫星顺利升空进入预定轨道&#xff0c;北斗导航卫星系统的产业化步伐也日益加快。从2007年第一颗北斗导航卫星成功发射&#xff0c;到2018年2月12日第二…

2018全球技术展望报告

来源&#xff1a;199IT互联网数据中心概要&#xff1a;随着人工智能&#xff08;AI&#xff09;和其他技术的飞速发展&#xff0c;智能企业层出不穷&#xff0c;并正融入人们的生活。埃森哲&#xff08;纽交所代码&#xff1a;ACN&#xff09;最新发布的《埃森哲技术展望2018》…

Loguru:Python 日志终极解决方案

From&#xff1a;https://blog.csdn.net/kdl_csdn/article/details/121146354 1、日志的重要性 日志的作用非常重要&#xff0c;日志可以记录用户的操作、程序的异常&#xff0c;还可以为数据分析提供依据&#xff0c;日志的存在意义就是为了能够在程序在运行过程中记录错误&am…

全球机器换人排行榜!这八个国家遥遥领先

来源&#xff1a; 机器人创新生态概要&#xff1a;如今&#xff0c;世界各国都在进行机器换人&#xff0c;希望把人力劳动从低端工作岗位释放出来&#xff0c;制造业自动化水平越来越高&#xff0c;工厂利用工业机器人获得了更低的成本、更高的效率和更快的生产速度。人力成本的…

视频监控成AI芯片主战场,海康威视和大华股份占据半壁江山

来源&#xff1a;MEMS概要&#xff1a;图像和视频的人工智能处理&#xff0c;是目前AI芯片商业化前景最乐观的赛道&#xff0c;也是玩家们弯道超车的最佳机会。 图像和视频的人工智能处理&#xff0c;是目前AI芯片商业化前景最乐观的赛道&#xff0c;也是玩家们弯道超车的最佳机…