Command模式
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模式的更多相关文章
- C++基础——模拟事务 (1)COMMAND模式
=================================版权声明================================= 版权声明:原创文章 禁止转载 请通过右侧公告中的“联系邮 ...
- 敏捷软件开发(3)---COMMAND 模式 & Active Object 模式
COMMAND 模式 command模式非常简单,简单到你无法想象的地方. public interface Command { void execute(); } 这就是一个command模式的样子 ...
- 条款19 command 模式与好莱坞法则
当一个函数对象被当做回调时候,就是一个command模式的实例 什么是回调? 回调就是框架知道什么时候干一些事情,但是具体干什么,或许框架一无所知(因为回调函数不是他设计的),而用户则知道发生一个特定 ...
- 开发设计模式(一)Command模式
Command定义 将来自客户端的请求传入一个对象,无需了解这个请求激活的 动作或有关接受这个请求的处理细节. 这是一种两台机器之间通讯联系性质的模式,类似传统过程语 言的 CallBack功能. 优 ...
- Command 模式
Command 模式通过将请求封装到一个对象(Command)中,并将请求的接受者存放具体的 ConcreteCommand 类中(Receiver)中,从而实现调用操作的对象和操作的具体实现 者之间 ...
- 【行为型】Command模式
命令模式是指将用户的请求封装成(命令)对象,从而可将用户不同的请求进行参数化.对这些请求排序或记录请求日志.以及支持回滚恢复操作.记得以前刚开始使用Photoshop时,就发现它的操作历史记录面板特别 ...
- [译]使用Command模式和MediatR简化你的控制器
原文 你希望保持你的controller足够简单. 你的controller越来越臃肿,你听说command模式是一个给controller瘦身的解决方案. 但是你不知道command模式是否适合你的 ...
- Java设计模式(22)命令模式(Command模式)
Command模式是最让我疑惑的一个模式,我在阅读了很多代码后,才感觉隐约掌握其大概原理,我认为理解设计模式最主要是掌握起原理构造,这样才对自己实际编程有指导作用.Command模式实际上不是个很具体 ...
- Xwork概况 XWork是一个标准的Command模式实现,并且完全从web层脱离出来。Xwork提供了很多核心功能:前端拦截机(interceptor),运行时表单属性验证,类型转换,强大的表达式语言(OGNL – the Object Graph NavigationLanguage),IoC(Inversion of Control反转控制)容器等。 ----------------
Xwork概况 XWork是一个标准的Command模式实现,并且完全从web层脱离出来.Xwork提供了很多核心功能:前端拦截机(interceptor),运行时表单属性验证,类型转换,强大的表达式 ...
随机推荐
- iOS9支付完成无法获取回调
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id ...
- 一个使用高并发高线程数 Server 使用异步数据库客户端造成的超时问题
现象 今天在做一个项目时, 将 tomcat 的 maxThreads 加大, 加到了 1024, tomcat 提供的服务主要是做一些运算, 然后插入 redis, 查询 redis, 最后将任务返 ...
- 统计学习方法笔记(KNN)
k近邻法(k-nearest neighbor,k-NN) 输入:实例的特征向量,对应于特征空间的点:输出:实例的类别,可以取多类. 分类时,根据其k个最近邻的训练实例的类别,通过多数表决等方式进行预 ...
- Java范型随笔
最近在帝都好无聊啊, 排遣寂寞就只有让自己不要停下来,不断的思考了 QWQ; 最近做ndk, java有点忘了,突然看到了一些java范型方面的问题, 踌躇了一会, 想着想着,决定还是写个随笔记录下来 ...
- jquery 获取radio选中的值
如下案例:常用方法 1.获取选中值,三种方法都可以: $('input:radio:checked').val(): $("input[type='radio']:checked" ...
- LeetCode OJ-- Remove Element
https://oj.leetcode.com/problems/remove-element/ 简单处理 class Solution { public: int removeElement(int ...
- HDU 5024 Wang Xifeng's Little Plot (DP)
题意:给定一个n*m的矩阵,#表示不能走,.表示能走,让你求出最长的一条路,并且最多拐弯一次且为90度. 析:DP,dp[i][j][k][d] 表示当前在(i, j)位置,第 k 个方向,转了 d ...
- SWAP空间不足,如何进行添加
交换分区值过小,可以有两种方法来增加swap分区,一种是将新的分区来作为swap,另一种是在磁盘中创建一个大的文件来作swap. 我们以文件扩展swap [root@xuegod63 ~]# cd / ...
- delphi 获取颜色值的RGB
前言:http://www.cnblogs.com/studypanp/p/5002953.html 获取的颜色值 前面获取到一个像素点的颜色值后(十六进制),比如说(黄色):FFD1C04C(共八位 ...
- 时间格式转化 String2datestyle
时间格式转化成string工具类: package cn.javass.util; import java.text.DateFormat; import java.text.SimpleDateFo ...