设计模式初探-命令模式(二)

2014-11-24 03:11:07 · 作者: · 浏览: 1
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、对于复杂的系统,可能会导致大量具体命令类的产生。