命令模式
属于行为模式
命令模式将一个请求或者操作封装到一个命令对象中。允许系统使用不同的请求将客户端参数化,对请求排队或者记录请求日志,提供命令的撤销,恢复能力
由于请求方和接收方被命令对象相对分割,从而有了下面这些优点:
1 命令模式使新的命令很容易被加入
2 允许接受请求方否决请求
3 可较容易地设计一个命令队列
4 可以实现对请求的Undo,Redo
5 可以将命令计入日志
类图一枚
命令模式设计5个角色:
客户角色Client:客户端,创建命令并确定接收对象
命令角色Command:所有具体命令的抽象接口
具体命令角色ConcreteCommand:接受者与行为之间的联系,调用接受者相关操作
请求者角色Invoker:调用命令对象执行请求
接受者角色Receiver:具体实施动作
下面是最简单的命令模式
首先是抽象的Command以及一个具体的ConcreteCommand,可以看到其中只定义实现了一个execute方法,ConcreteCommand持有一个接受者对象,execute方法实际是调用receiver中的action方法。
public interface Command {
public void execute();
}
public class ConcreteCommand implements Command{
private Receiver receiver;
public void setReceiver(Receiver receiver){
this.receiver=receiver;
}
@Override
public void execute() {
receiver.action();
}
}
Receiver对象,其中只有action方法,即表示实际需要进行的动作
public class Receiver {
public void action(){
System.out.println("Reciever has done the Action");
}
}
Invoker请求者对象,持有具体要委派的命令,并调用命令的execute方法
public class Invoker {
private Command command;
public void setCommand(Command command){
this.command=command;
}
public void runCommand(){
command.execute();
}
}
客户端只是负责创建命令和确定接受者,其中的连接由各自完成。
public class Client {
public static void main(String[] args) {
Receiver receiver=new Receiver();
ConcreteCommand command=new ConcreteCommand();
command.setReceiver(receiver);
Invoker invoker=new Invoker();
invoker.setCommand(command);
invoker.runCommand();
}
}
最终可以看到输出了一行结果:
Reciever has done the Action
其实从上面的调用过程中就可以清楚的看到命令模式的整个运行过程:
1 客户端创建命令对象,指明接受者
2 请求者对象保存命令
3 请求者对象通过runCommand发出请求,在这之中,可以在命令角色中通过一个状态变量控制undo redo或者其他操作的控制
4 命令对象调用接收者方法执行操作
在上面的例子并没有体现出关于undo,redo的功能
而如果需要这类功能,同样是在ConcreteCommand中进行处理,例如添加一个List来记录前后操作,并在执行时更新。
命令模式有一个比较明显的缺点,就是当命令数量比较多时,会产生相当数量的ConcreteCommand具体命令类。
总体来说命令模式即是由原来的请求-接收中间添加了一个命令对象,通过命令对象实现了两者间的解耦,并添加某种程度的控制和记录。
http://www.cnblogs.com/sjms/archive/2010/07/16/1778527.html
上面的博客中有关于undo的一个简单实现,应该说研磨设计模式是写得非常浅显易懂的,包括其中其他的部分 推荐一看
- 大小: 4.3 KB
分享到:
相关推荐
Solidworks学习笔记——随形变化.docxSolidworks学习笔记——随形变化.docxSolidworks学习笔记——随形变化.docxSolidworks学习笔记——随形变化.docxSolidworks学习笔记——随形变化.docxSolidworks学习笔记——...
Cocos2d-x学习笔记——完全掌握C++ API与游戏项目开发.zip
Oracle学习笔记——day02 学习的好东西 Oracle学习笔记——day02
Oracle学习笔记——day04 学习的好东西 Oracle学习笔记——day04
Oracle学习笔记——day05 学习的好东西 Oracle学习笔记——day05
Oracle学习笔记——day03 学习的好东西 Oracle学习笔记——day03
Oracle学习笔记——day01 学习的好东西Oracle学习笔记——day01
设计模式学习笔记-命令模式
RRT学习笔记——记录
Linux笔记——命令:awk Linux笔记——命令:sed Linux笔记——命令:grep Linux笔记——命令:find Linux笔记——命令:Sort,uniq,join,cut,paste,split Linux笔记——shell基础:变量&本地变量&位置变量&特定变量...
Android学习笔记——获取网络图片并显示
python 学习笔记——线性回归预测模型.pdf python 学习笔记——线性回归预测模型.pdf python 学习笔记——线性回归预测模型.pdf python 学习笔记——线性回归预测模型.pdf python 学习笔记——线性回归预测模型.pdf ...
jBPM-jPDL学习笔记——流程设计与控制
Go 学习笔记——雨痕,pdf文字版带书签。在不侵犯作者个人权利的前提下,可自由散播本书。
Python学习笔记——运算符 运算符: 赋值运算符 算术运算符 关系运算符 逻辑运算符 位运算
C语言学习笔记——小浪神
——————————————————————————————————————————————
ArcGIS客户端开发学习笔记——XML学习
A星算法学习笔记——记录