这两天我们给Aexi增加了Command模式。
其实我对于Command模式比较少的印象就是可以用来做撤销操作的功能,我看过的所有的书对于这个模式的介绍,都是把它和撤销操作相联系,似乎Command模式是专门为这一功能设计的.Command模式有没有其他的应用呢,我也不太知道,但是既然这里可以用到,那我们就在这里用一下.至于对这个模式更深层次的理解,那就等到遇到相应的问题的时候具体对待了,但是至少得有一个基本的印象才可以.
首先定义Command接口,代码如下:
public interface Command { public boolean excute(); public void unExcute(); public boolean canUndo(); }
所有的命令的子类都需要实现这个接口,其中excute()方法是当前命令对象的具体的业务代码.unExcute()方法是当前命令对象的反操作的代码,用于撤销当前操作.canUndo()方法返回一个布尔值用来确定当前命令对象是否是可以执行的撤销的操作.
下面再来看一个Command的管理类.代码如下:
public class CommandManager { private Command currentCommand; private List<Command> commands = new ArrayList<>(); public void setCurrentCommand(Command currentCommand) { this.currentCommand = currentCommand; } public void excuteCommand() { if (currentCommand.excute() && currentCommand.canUndo()) addToCommandList(); } private void addToCommandList() { assert currentCommand.canUndo(); commands.add(currentCommand); } private static CommandManager instance = new CommandManager(); private CommandManager() {} public static CommandManager getInstance() { return instance; } }
因为这个Commandmanager类全局范围中只允许出现一个,所以我将它写成了单例模式.
类中有两个字段currentCommand和commands。其中currentCommand是当前正在执行的命令.Commands是命令的一个列表,用于存储执行过的命令历史。下面是客户端调用的代码:
if (e.getKeyChar() == '\b') { command = new DeleteCommand(composition); }else { command = new InsertCommand(composition,new Character(e.getKeyChar(),font)); } commandManager.setCurrentCommand(command); commandManager.excuteCommand();
主要有这么几步:
第一:创建对应的实现了接口的具体类
第二:获得CommandMannager对象,给CommandManager设置currentCommand。
第三:调用Commandmanager的excuteCommand方法.
这样的话就实现了Command模式.
时间: 2024-10-14 04:03:20