java 实现指令的撤销_用命令模式实现撤销与恢复
时间: 2023-12-16 19:06:22 浏览: 97
命令模式(撤销) - 代码(Java)
5星 · 资源好评率100%
Java中可以使用命令模式来实现指令的撤销和恢复。命令模式是一种行为设计模式,它将请求封装成一个对象,从而使得可以使用不同的请求来参数化其他对象。这种模式允许将请求排队或者记录请求日志,以及支持可撤销的操作。
在实现指令的撤销和恢复时,可以定义一个Command接口,其中定义了execute()和undo()两个方法。execute()方法执行指令,而undo()方法用于撤销指令。具体的指令可以通过实现Command接口来实现。
为了支持多次撤销和恢复操作,可以使用一个栈来保存执行的指令,当需要撤销时,将栈顶的指令弹出并执行undo()方法即可。当需要恢复时,将栈顶的指令弹出并执行execute()方法即可。
以下是一个简单的示例代码:
```
public interface Command {
void execute();
void undo();
}
public class CommandImpl implements Command {
private Receiver receiver;
private String arg;
public CommandImpl(Receiver receiver, String arg) {
this.receiver = receiver;
this.arg = arg;
}
@Override
public void execute() {
receiver.action(arg);
}
@Override
public void undo() {
receiver.undo();
}
}
public class Receiver {
private String state;
public void action(String arg) {
state = arg;
System.out.println("执行指令,设置状态为:" + state);
}
public void undo() {
System.out.println("撤销指令,状态恢复为:" + state);
}
}
public class Invoker {
private Stack<Command> undoStack = new Stack<>();
private Stack<Command> redoStack = new Stack<>();
public void execute(Command command) {
command.execute();
undoStack.push(command);
redoStack.clear();
}
public void undo() {
if (!undoStack.isEmpty()) {
Command command = undoStack.pop();
command.undo();
redoStack.push(command);
}
}
public void redo() {
if (!redoStack.isEmpty()) {
Command command = redoStack.pop();
command.execute();
undoStack.push(command);
}
}
}
public class Client {
public static void main(String[] args) {
Invoker invoker = new Invoker();
Receiver receiver = new Receiver();
Command command1 = new CommandImpl(receiver, "state1");
invoker.execute(command1);
Command command2 = new CommandImpl(receiver, "state2");
invoker.execute(command2);
invoker.undo();
invoker.redo();
}
}
```
在上述示例代码中,CommandImpl类实现了Command接口,Receiver类是命令的接收者,Invoker类用于执行和撤销命令,Client类是测试类。当执行main()方法时,会输出以下内容:
```
执行指令,设置状态为:state1
执行指令,设置状态为:state2
撤销指令,状态恢复为:state1
执行指令,设置状态为:state2
```
可以看到指令的撤销和恢复操作都成功地实现了。
阅读全文