敏捷软件开发(3)---COMMAND 模式 & Active Object 模式
COMMAND 模式
command模式非常简单,简单到你无法想象的地方。
public interface Command {
void execute();
}
这就是一个command模式的样子。也许你会觉得,这有点多此一举吗。但是当你使用他的时候,command模式就会闪现光华。
这样一个场景:经理张三叫leader王二去开发一个项目, 王二就安排李四 去开发这个功能A。 李四何时执行,怎么执行就是他自己的事情了。
public interface CommandInterface {
void execute();
}
public class ContractCommand implements CommandInterface {
Member member;
public ContractCommand(Member member) {
this.member = member;
}
@Override
public void execute() {
member.action();
}
}
public class Member {
public void action()
{
TraceLog.i();
}
}
Leader,获取命令,然后执行命令。
public class Leader {
CommandInterface commandInterface;
public void setCommandInterface(CommandInterface commandInterface) {
this.commandInterface = commandInterface;
}
public void executeCommand()
{
commandInterface.execute();
}
}
public class Manager {
public static void main()
{
Member m = new Member();
CommandInterface c = new ContractCommand(m);
Leader wang2 = new Leader();
wang2.setCommandInterface(c);
wang2.executeCommand();
}
}
manager创建运行的平台。
这样命令模式就开启了。
Active Object
Active Object 模式
一开始蛮难理解这个模式的目的,而且GOF的23中经典模式里也没有这个模式。
/**
* @author deman.lu
* @version on 2016-06-02 14:45
*/
public class ActiveObjectEngine {
List<CommandInterface> itsCommands = new ArrayList(); /*need to running in main thread, should check with synchronized*/
public void addCommand(CommandInterface aCommand)
{
itsCommands.add(aCommand);
} public void run()
{
/*should running in background*/
while (itsCommands.size() > 0)
{
CommandInterface c = itsCommands.get(0);
itsCommands.remove(0);
c.execute();
}
}
}
这个就是ActiveObject的engine,2个函数。一个是把一条command添加到表里面。
另一个是一个循环,处理问题。仔细思考,这就是消费者,和生产者问题的变种。
but这里没有线程block的地方。先看完全部代码:
public class SleepCommand implements CommandInterface {
@Override
public void execute() {
Date currentTime = new Date();
if (!started) {
started = true;
this.startTime = currentTime;
this.engine.addCommand(this);
} else {
long elapsedTime = currentTime.getTime() - startTime.getTime();
if (elapsedTime < SleepTime) {
this.engine.addCommand(this);
} else {
this.engine.addCommand(this.wakeupCommand);
}
}
}
private CommandInterface wakeupCommand = null;
private ActiveObjectEngine engine = null;
private long SleepTime = 0;
private Date startTime;
private boolean started = false;
public SleepCommand(long milliSeconds, ActiveObjectEngine e,
CommandInterface wakeupCommand) {
this.SleepTime = milliSeconds;
this.engine = e;
this.wakeupCommand = wakeupCommand;
}
}
public class DelayedTyper implements CommandInterface {
private long itsDelay;
private char itsChar;
private static boolean stop = false;
static String printStr = "";
private static ActiveObjectEngine engin =
new ActiveObjectEngine();
static class StopCommand implements CommandInterface
{
@Override
public void execute() {
DelayedTyper.stop = true;
}
}
public static void Main()
{
engin.addCommand(new DelayedTyper(100, 'A'));
engin.addCommand(new DelayedTyper(300, 'B'));
engin.addCommand(new DelayedTyper(500, 'C'));
engin.addCommand(new DelayedTyper(700, 'D'));
CommandInterface stopCommand = new StopCommand();
engin.addCommand(new SleepCommand(2000, engin, stopCommand));
engin.run();
TraceLog.i(printStr);
}
public DelayedTyper(long delay, char c)
{
this.itsDelay = delay;
this.itsChar = c;
}
@Override
public void execute()
{
printStr +=itsChar;
if (!stop)
{
DelayAndRepeat();
}
}
private void DelayAndRepeat()
{
engin.addCommand(new SleepCommand(itsDelay, engin, this));
}
}
结果如下:
ABCDAAABACABAADAABCAAABAADABCAAABAACDB
当DelayedTyper没有到执行的时间点的时候,启动SleepCommand。
这个很关键,
if (elapsedTime < SleepTime) {
this.engine.addCommand(this);
} else {
this.engine.addCommand(this.wakeupCommand);
}
如果时间没到,就把自己加入到队列最后,等待下次执行。(此处没有用常见的线程block技术)
时间到了,就把wakeupCommand加入执行队列。
这里还有个关键是,没有stopcommand,命令会一直循环执行。
参考:
《敏捷软件开发》 Robert C. Martin
敏捷软件开发(3)---COMMAND 模式 & Active Object 模式的更多相关文章
- Java多线程编程模式实战指南:Active Object模式(下)
Active Object模式的评价与实现考量 Active Object模式通过将方法的调用与执行分离,实现了异步编程.有利于提高并发性,从而提高系统的吞吐率. Active Object模式还有个 ...
- java Active Object模式(下)
Active Object模式的评价与实现考量 Active Object模式通过将方法的调用与执行分离,实现了异步编程.有利于提高并发性,从而提高系统的吞吐率. Active Object模式还有个 ...
- Java多线程编程模式实战指南一:Active Object模式(下)
Active Object模式的评价与实现考量 Active Object模式通过将方法的调用与执行分离,实现了异步编程.有利于提高并发性,从而提高系统的吞吐率. Active Object模式还有个 ...
- Java多线程编程模式实战指南(一):Active Object模式--转载
本文由黄文海首次发布在infoq中文站上:http://www.infoq.com/cn/articles/Java-multithreaded-programming-mode-active-obj ...
- 敏捷软件开发(4)--- TEMPLATE METHOD & STRATEGY 模式
1.TEMPLATE METHOD 泛型,也就是这个模式,是可以基于泛型的. 我们往往会有一些算法,比如排序算法.它的算法部分,我可以把它放在一个基类里面,这样具体类型的比较可以放在子类里面. 看如下 ...
- 敏捷软件开发:原则、模式与实践——第12章 ISP:接口隔离原则
第12章 ISP:接口隔离原则 不应该强迫客户程序依赖并未使用的方法. 这个原则用来处理“胖”接口所存在的缺点.如果类的接口不是内敛的,就表示该类具有“胖”接口.换句话说,类的“胖”接口可以分解成多组 ...
- 敏捷软件开发:原则、模式与实践——第13章 写给C#程序员的UML概述
第13章 写给C#程序员的UML概述 UML包含3类主要的图示.静态图(static diagram)描述了类.对象.数据结构以及它们之间的关系,藉此表现出了软件元素间那些不变的逻辑结构.动态图(dy ...
- 敏捷软件开发:原则、模式与实践——第9章 OCP:开放-封闭原则
第9章 OCP:开放-封闭原则 软件实体(类.模块.函数等)应该是可以扩展的,但是不可修改. 9.1 OCP概述 遵循开放-封闭原则设计出的模块具有两个主要特征: (1)对于扩展是开放的(open f ...
- 敏捷软件开发(1)--- STATE 模式
如果状态在运行过程中,不停的切换和改变,我们怎么办? 状态的迁移是我们生活和工程中非常普遍的一个概念.于是在数学上有一种理论来分析和解决这个问题. 有限状态机理论是一个非常成熟的理论,所有动作和流程的 ...
随机推荐
- [IR] Information Extraction
阶段性总结 Boolean retrieval 单词搜索 [Qword1 and Qword2] O(x+y) [Qword1 and Qword2]- 改进: Gallo ...
- SQL Server里强制参数化的痛苦
几天前,我写了篇SQL Server里简单参数化的痛苦.今天我想继续这个话题,谈下SQL Server里强制参数化(Forced Parameterization). 强制参数化(Forced Par ...
- [Solution] 一步一步WCF(1) 快速入门
Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台.整合了原有的windows通讯的 .n ...
- [Solution] Microsoft Windows 服务(2) 使用Topshelf创建Windows服务
除了通过.net提供的windows服务模板外,Topshelf是创建Windows服务的另一种方法. 官网教程:http://docs.topshelf-project.com/en/latest/ ...
- JavaScript 面向对象继承详解
题记 由于js不像java那样是完全面向对象的语言,js是基于对象的,它没有类的概念.所以,要想实现继承,一般都是基于原型链的方式: 一.继承初探 大多数JavaScript的实现用 __proto_ ...
- SeaJS 模块化加载框架使用
SeaJS 是一个遵循 CMD 规范的模块化加载框架 CommonJS,CMD,AMD等规范后文会提到,这里主要先了解如何在代码中使用. 如果你有使用过nodejs ,那么理解起来就容易多了. 我们通 ...
- 重构第31天 使用多态替代条件语句( Replace conditional with Polymorphism)
理解:本文中的”使用多态代替条件判断”是指如果你需要检查对象的类型或者根据类型执行一些操作时,一种很好的办法就是将算法封装到类中,并利用多态性进行抽象调用. 详解:本文展示了面向对象编程的基础之一“多 ...
- jQuery的事件change
人生还在继续,只有不断补充以前所不懂的知识,今天练习一个jQuery的事件change.这个事件是在对象失去focus并且原本值有所变化时就产生此事件.如select时,用户所选择的选项有变时,或是t ...
- sql语句分页多种方式ROW_NUMBER()OVER
sql语句分页多种方式ROW_NUMBER()OVER 摘自: http://www.cnblogs.com/CodingArt/articles/1692468.html 方式一 select to ...
- 四项技术 助你提高SQL Server的性能
有时,为了让应用程序运行得更快,所做的全部工作就是在这里或那里做一些很小调整.但关键在于确定如何进行调整!迟早您会遇到这种情况:应用程序中的 SQL 查询不能按照您想要的方式进行响应.它要么不返回数据 ...