当前位置:首页 > Java

JAVA如何撤销动作

2026-03-22 04:10:36Java

撤销动作的实现方法

在Java中实现撤销功能通常依赖于设计模式中的命令模式(Command Pattern)或备忘录模式(Memento Pattern)。以下是两种常见的方法:

命令模式实现撤销

命令模式通过封装操作为对象,支持撤销操作。以下是核心步骤:

定义命令接口:

public interface Command {
    void execute();
    void undo();
}

实现具体命令类:

JAVA如何撤销动作

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();
        }
    }
}

备忘录模式实现撤销

备忘录模式通过保存对象状态实现撤销:

JAVA如何撤销动作

定义备忘录类:

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();
    }
}

实际应用选择

  • 简单场景:命令模式更适合需要记录操作序列的场景
  • 复杂对象状态:备忘录模式更适合需要保存完整对象状态的场景
  • 混合使用:某些情况下可以组合使用两种模式

注意事项

  • 内存管理:大量撤销操作可能导致内存消耗,需设置历史记录上限
  • 线程安全:多线程环境下需要对命令历史或状态栈进行同步处理
  • 性能考虑:频繁的状态保存可能影响性能,需权衡粒度

标签: 动作JAVA
分享给朋友:

相关文章

JAVA验证码如何验证

JAVA验证码如何验证

JAVA验证码验证方法 验证码验证通常分为生成、存储、用户输入验证三个步骤。以下是常见的实现方法: 生成验证码 使用Java生成随机验证码(数字、字母或混合)并输出为图片或文字: // 生成4位随…

JAVA 如何使用kafka

JAVA 如何使用kafka

使用 Java 操作 Kafka 的基本步骤 添加依赖 在 Maven 或 Gradle 项目中添加 Kafka 客户端依赖。以下是 Maven 的配置示例: <dependency>…

js实现投篮动作

js实现投篮动作

实现投篮动作的基本思路 在JavaScript中实现投篮动作可以通过物理引擎模拟或手动计算抛物线轨迹。以下是两种常见方法: 使用Canvas绘制抛物线动画 通过Canvas绘制篮球的抛物线运动,需要…

JAVA中如何进行异常处理

JAVA中如何进行异常处理

JAVA异常处理的基本结构 在JAVA中,异常处理通过try-catch-finally块实现。代码可能抛出异常的语句放在try块中,catch块捕获并处理特定异常,finally块用于执行无论是否发…

如何查看JAVA组件

如何查看JAVA组件

查看已安装的Java组件 使用命令行工具java -version可以查看当前安装的Java运行时环境(JRE)版本。若要查看Java开发工具包(JDK)版本,使用javac -version。 列…

JAVA如何纵向输出

JAVA如何纵向输出

纵向输出字符串的方法 在Java中实现字符串的纵向输出,可以通过多种方式实现。以下是几种常见的方法: 方法一:使用循环遍历字符数组 将字符串转换为字符数组,通过循环逐个输出每个字符并换行。 St…