ic void execute() {
receiver.action();
}
@Override
public String toString(){
return "ConcreteCommandA ";
}
}
/**
* 具体命令实现,覆盖默认命令类的execute()
*/
class ConcreteCommandB extends DefaultCommand{
private ReceiverB receiver = new ReceiverB();
@Override
public void execute() {
receiver.action();
}
@Override
public String toString(){
return "ConcreteCommandB ";
}
}
/**
* 宏命令:使用组合模式和命令模式,批量执行命令
*/
class MacroCommand implements Command{
private List commands = new ArrayList();
@Override
public void addCommand(Command command) {
this.commands.add(command);
}
@Override
public void removeCommand(Command command) {
this.commands.remove(command);
}
/**
* 除了通过一个逆向操作来实现撤销(Undo)外,还可以通过保存对象的历史状态来实现撤销,
* 后者可使用备忘录模式(Memento Pattern)来实现。
*/
@Override
public void undo() {
if(commands.size()>0){
System.out.println("撤销命令:"+commands.get(commands.size()-1));
}
}
@Override
public void redo() {
if(commands.size()>0){
System.out.println("重做命令:"+commands.get(commands.size()-1));
}
}
@Override
public void execute() {
for(Command com : commands){
com.execute();
}
}
/**
* 序列化过程省略,Command需要实现java.io.Serializable接口.
*/
@Override
public void readLog(String fileName) {
System.out.println("从日志文件:"+fileName+"中加载命令列表...");
}
/**
* 反序列化过程省略,只是用来说明命令模式可以记录命令日志文件.
*/
@Override
public void writeLog(String fileName) {
System.out.println("持久化命令列表:"+commands+"到日志文件:"+fileName);
}
}运行结果:
ReceiverA:do something....
ReceiverB:do something....
撤销命令:ConcreteCommandB
重做命令:ConcreteCommandB
持久化命令列表:[ConcreteCommandA , ConcreteCommandB ]到日志文件:config.log
从日志文件:config.log中加载命令列表...
四、模式优缺点
优点:
1、降低系统耦合度。Command模式将调用操作的对象与知道如何实现该操作的对象解耦。
2、增加新的Command很容易,无需改变已有的类,扩展性强。
3、可以将多个命令装配成一个复合命令(宏命令)。
4、为请求的撤销(Undo)和重做(Redo)提供了一种设计和实现方案。
缺点:
1、对于复杂的系统,可能会导致大量具体命令类的产生。