1.命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开。
2.每一个命令都是一个操作:请求的一方发出请求,要求执行一个操作;接收的一方收到请求,并执行操作。
3.命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。
4.命令模式使请求本身成为一个对象,这个对象和其他对象一样可以被存储和传递。
5.命令模式的关键在于引入了抽象命令接口,且发送者针对抽象命令接口编程,只有实现了抽象命令接口的具体命令才能与接收者相关联。
撤销命令模式
要在遥控器加上撤销功能很简单,它的功能是这样的:比如说是电灯关闭的,你按下了开启按钮,电灯就亮了,然后你按下撤销按钮,灯就又不亮了。相当与撤销上一次的命令。
1. 在Command接口上加上undo()方法
[java] view plaincopypublic interface Command {
public void execute();
public void undo();
}
2. 如果是开灯的命令,那么他的撤销命令就是关灯。同理,如果是关灯的命令,那么他的撤销命令就是开灯。
[java] view plaincopy// 开灯命令
public class LightOnCommand implements Command{
Light light;
public LightOnCommand(Light light) {
this.light = light;
}
public void execute() {
light.on();
}
// 实现了撤销功能:变成关灯
public void undo(){
light.off();
}
}
[java] view plaincopy// 关灯命令
public class LightOffCommand implements Command{
Light light;
public LightOffCommand(Light light) {
this.light = light;
}
public void execute() {
light.off();
}
// 关灯的撤销命令是开灯
public void undo(){
light.on();
}
}
要实现命令模式的撤销功能,还是很简单的,只要学会了保存上一次的命令,那么随便就可以写出来了
宏命令模式
如果遥控器拥有一个功能,按下一个按钮,就可以实现很多功能,要怎么做?
也很简单,用一个数组存下所有命令即可
[java] view plaincopypublic class MacroCommand implements Command {
Command[] commands;
public MacroCommand(Command[] commands) {
this.commands = commands;
}
public void execute() {
for(int i = 0; i < commands.length; i++)
commands[i].execute();
}
public void undo() {
for(int i = 0; i < commands.length; ++i)
commands[i].undo();
}
}
如果要可以撤销很多次怎么做?
也很简单,不只是记录最后一个被执行的命令,而使用一个堆栈记录操作过程的没一个命令。然后不管什么时候按下了撤销按钮,你都可以从堆栈中取出最上层的命令,然后调用它的undo()方法。
命令模式的更多用途: 队列请求
命令可以将运算块打包,然后把它传来传去,就像是一般的对象一样。即使命令对象被创建许久之后,运算依然可以被调用。
事实上,它甚至可以在不同的线程中被调用。我们利用这样的特性衍生出一些应用,例如:日程安排(Scheduler),线程池,工作队列等。
命令模式的更多用途:日志请求
某些应用需要把所有动作都记录在日志中,并能在系统死机后,重新调用这些动作恢复到之前的状态。
通过新增两个方法(store(), load() ),命令模式就能够支持这一点。
在只要当我们执行命令时,将历史记录存储在磁盘中,一旦系统死机,就可以将命令对象重载,并成批地一次调用这些
对象的execute()方法。
原文转自:http://blog.csdn.net/shuangde800/article/details/9840259