JAVA如何撤销动作
撤销动作的实现方法
在Java中实现撤销功能通常依赖于设计模式中的命令模式(Command Pattern)或备忘录模式(Memento Pattern)。以下是两种常见的方法:
命令模式实现撤销
命令模式通过封装操作为对象,支持撤销操作。以下是核心步骤:
定义命令接口:
public interface Command {
void execute();
void undo();
}
实现具体命令类:

public class ConcreteCommand implements Command {
private Receiver receiver;
private String previousState;
public ConcreteCommand(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
previousState = receiver.getState();
receiver.action();
}
@Override
public void undo() {
receiver.setState(previousState);
}
}
维护命令历史:
public class Invoker {
private Stack<Command> commandHistory = new Stack<>();
public void executeCommand(Command command) {
command.execute();
commandHistory.push(command);
}
public void undo() {
if (!commandHistory.isEmpty()) {
Command command = commandHistory.pop();
command.undo();
}
}
}
备忘录模式实现撤销
备忘录模式通过保存对象状态实现撤销:

定义备忘录类:
public class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
在原始类中管理状态:
public class Originator {
private String state;
public void setState(String state) {
this.state = state;
}
public Memento saveStateToMemento() {
return new Memento(state);
}
public void getStateFromMemento(Memento memento) {
state = memento.getState();
}
}
使用管理者类维护历史:
public class CareTaker {
private Stack<Memento> mementoStack = new Stack<>();
public void add(Memento state) {
mementoStack.push(state);
}
public Memento get() {
return mementoStack.pop();
}
}
实际应用选择
- 简单场景:命令模式更适合需要记录操作序列的场景
- 复杂对象状态:备忘录模式更适合需要保存完整对象状态的场景
- 混合使用:某些情况下可以组合使用两种模式
注意事项
- 内存管理:大量撤销操作可能导致内存消耗,需设置历史记录上限
- 线程安全:多线程环境下需要对命令历史或状态栈进行同步处理
- 性能考虑:频繁的状态保存可能影响性能,需权衡粒度






