设计模式——命令模式(下)
作者:云都小生
命令队列的处理
现实中有这么一种情况,我们墙壁上有一个按钮开关,这个开关按下去之后,就会打开厕所的电灯和排风扇。
没错,在命令模式的设计过程中我们也会碰到这样的情况,我们的接受者并不只有一个,所以我们需要一个命令队列。先让接受者1进行处理,再让接受者2进行处理。
class CommandQueue {
//定义一个ArrayList来存储命令队列
private ArrayList<Command> commands = new ArrayList<Command>();
public void addCommand(Command command) {
commands.add(command);
}
public void removeCommand(Command command) {
commands.remove(command);
}
//循环调用每一个命c令对象的execute()方法
public void exeute() {
for (Object command : commands) {
((Command)command).execute();
}
}
}
class Invoker {
private CommandQueue commandQueue;
public Invoker(CommandQueue commandQueue) {
this. commandQueue = commandQueue;
}
public void setCommandQueue(CommandQueue commandQueue) {
this.commandQueue = commandQueue;
}
public void call() {
commandQueue.execute();
}
}
撤销与恢复
命令模式的设计中,可以实现撤销(回到上一个状态),也可以实现(恢复撤销前的一个状态)。
这两个功能要按具体情况去设计,不过,可以采用“保存对象上一个状态”来实现,也就是每次进行这次操作之后,就Undo()保存这个对象相关的关键信息(属性)。
还可以实现一个Redo()方法,恢复到“撤销前”的一个状态。
日志的引入
日志可以记录用户的操作,也可以记录程序的关键信息。
该功能也要按照具体情况的去设计。
不算总结的总结
命令模式的关键在于,它对请求发送者和接受者进行了解耦,让它们之间并不存在直接的关系。
没错,优点就是降低了系统的耦合度,符合开闭原则,需要添加新命令的时候可以不修改源代码,直接添加。但是,如果命令太多的话,就会影响整个系统。
2018/1/9 9:10:14 @Author:Cloudking