java如何撤销
撤销操作的基本方法
在Java中实现撤销功能通常依赖于设计模式中的命令模式(Command Pattern)。核心思想是将操作封装为对象,记录操作的历史记录,便于回退。
定义一个抽象命令接口:
public interface Command {
void execute();
void undo();
}
具体命令实现需保存操作前的状态:
public class ConcreteCommand implements Command {
private Receiver receiver;
private Object previousState;
public void execute() {
previousState = receiver.getState(); // 保存状态
receiver.action();
}
public void undo() {
receiver.setState(previousState); // 恢复状态
}
}
历史记录管理
使用栈结构存储命令历史:
public class CommandHistory {
private Stack<Command> history = new Stack<>();
public void push(Command c) {
history.push(c);
}
public Command pop() {
return history.pop();
}
public boolean isEmpty() {
return history.isEmpty();
}
}
调用示例:
CommandHistory history = new CommandHistory();
Command cmd = new ConcreteCommand(receiver);
cmd.execute(); // 执行操作
history.push(cmd); // 记录
// 撤销操作
if (!history.isEmpty()) {
history.pop().undo();
}
多级撤销实现
扩展历史记录管理支持多步撤销:
public class MultiLevelHistory {
private Stack<Command> undoStack = new Stack<>();
private Stack<Command> redoStack = new Stack<>();
public void execute(Command cmd) {
cmd.execute();
undoStack.push(cmd);
redoStack.clear(); // 新操作后清空重做栈
}
public void undo() {
if (!undoStack.isEmpty()) {
Command cmd = undoStack.pop();
cmd.undo();
redoStack.push(cmd);
}
}
public void redo() {
if (!redoStack.isEmpty()) {
Command cmd = redoStack.pop();
cmd.execute();
undoStack.push(cmd);
}
}
}
状态快照方案
对于复杂对象,可采用备忘录模式(Memento Pattern)保存完整状态:
public class Originator {
private String state;
public Memento save() {
return new Memento(state);
}
public void restore(Memento m) {
state = m.getState();
}
// Memento为内部类
public static class Memento {
private final String state;
private Memento(String state) {
this.state = state;
}
private String getState() {
return state;
}
}
}
使用示例:
Originator originator = new Originator();
Stack<Originator.Memento> history = new Stack<>();
// 保存状态
history.push(originator.save());
// 恢复状态
originator.restore(history.pop());
事务性撤销
对于数据库操作等场景,需结合事务管理:

try {
Connection conn = DriverManager.getConnection(DB_URL);
conn.setAutoCommit(false); // 关闭自动提交
// 执行SQL操作
Statement stmt = conn.createStatement();
stmt.executeUpdate("INSERT INTO table VALUES (...)");
// 用户触发撤销
conn.rollback(); // 回滚事务
} catch (SQLException e) {
e.printStackTrace();
}






