对命令模式里的执行者角色表示不太理解,感觉不太需要这个角色
我的理解是,当我们将不同行为抽象为统一的命令类后,命令模式希望我们做的我们就已经完成了,关键就在于将行为(方法)抽象为命令(类),为啥要将行为抽象为命令?这就涉及到命令模式的使用场景,需要对一系列的行为进行统一控制,以及方便的组合扩展操作。举个例子: 有一个Navvy类(挖土机),其中有各种方法,比如moveFront(),moveLeft(),moveUp(),moveDown(),doPick()抓取,doDig()挖掘 等等,现在老板说了,要有一个控制台,可以对挖土机下达指令,指令下达完成后挖机才会开始动作,每个指令包含一连串的行为(比如 指令1:左移+左移+下移+挖掘,指令2:前移+前移+右移+右移+下移+抓取),你看到了,每个指令可以包含任意个行为,行为之间可以任意组合。这种场景我们是无法通过普通方法调用的方式来完成的,此时就该命令模式上场了,
我们抽象出一个命令接口: Navvy类中的每个操作方法,都抽象为命令接口的实现类,也就是具体命令类,我们列举一个:
剩余的MoveLeftCommand,MoveFrontCommand。。。。。类似,就不贴出图了。
指令类如下:
挖机代码很简单,也贴下:
准备工作已经就绪,接下来就可以编写控制台代码了,如下:
/**
* @desc 控制台
*/public class ControlPanel {
//开始一个新的指令
public Instructions startEdit() {
return new Instructions();
}//添加命令
public void addCommand(Instructions instructions,IOperateCommand command) {
instructions.addCommand(command);
}//回退命令
public void rollbackCommand(Instructions instructions) {
instructions.rollbackCommand();
}//执行指令
public void executeInstructions(Instructions instructions) {
List<IOperateCommand> commands=instructions.getCommandList();
if(commands==null||commands.isEmpty()) {
return;
}
System.out.println("开始执行指令啦,当前时间:"+System.currentTimeMillis());
for(IOperateCommand command:commands) {
command.execute();
}
System.out.println("指令执行完成啦,当前时间:"+System.currentTimeMillis());
}public static void main(String[] args) {
ControlPanel controlPanel=new ControlPanel();
//开始编辑指令
Instructions instructions=controlPanel.startEdit();
//为指令添加行为
controlPanel.addCommand(instructions, new MoveLeftCommand());
controlPanel.addCommand(instructions, new MoveLeftCommand());
controlPanel.addCommand(instructions, new MoveFrontCommand());
controlPanel.addCommand(instructions, new PickCommand());
//执行指令
controlPanel.executeInstructions(instructions);
}
}
运行控制台main方法,执行结果如下:
结果符合预期,代码也比较简单,我们将Navvy类的每个行为都抽象为一个命令类,然后在控台中就可以方便的进行命令的任意组合了,如果现在Navvy又多了一个行为,我们是不是只要新增一个命令类就可以了?试想如果没有这层抽象,在控制台中我们只能操作Navvy的方法,能任意组合吗?能这么优雅吗?
有了这层思想基础,剩余的扩展,比如通用的权限控制(执行每个命令前检查权限),日志记录(执行命令前后记录日志),又或者回滚,支持命令集合的备份等等,都很简单了
总结:以上就是我理解的命令模式了,关键就在于将行为抽象为命令类,如此而已...