备忘录模式(Memento Pattern)

备忘录模式(Memento Pattern)是一种行为型设计模式,主要用于在不破坏对象封装性的前提下捕获并外部化对象的内部状态,从而可以在以后将对象恢复到原先保存的状态。这种模式常用于实现撤销操作、历史记录回溯等功能。

备忘录模式的核心组成部分:

  1. Originator(发起人)

    负责创建一个备忘录,用于记录当前时刻自身的内部状态,并可以使用备忘录恢复内部状态。

  2. Memento(备忘录)

    用于存储 Originator 的内部状态。备忘录需要保护其内容不被除 Originator 之外的对象访问,以保证封装性。

  3. Caretaker(管理者)

    负责保存备忘录,但不能对备忘录的内容进行操作或检查。它主要负责备忘录的存取管理。


备忘录模式的应用场景

  • 文本编辑器中的撤销功能:用户每执行一次操作(如输入、删除等),系统都会保存当前状态到备忘录中。当用户点击撤销时,可以通过备忘录恢复到上一个状态。
  • 游戏存档功能:玩家在游戏过程中可以保存当前进度(角色位置、生命值、装备等),并在需要时加载之前的存档。
  • 事务回滚机制:在数据库操作中,如果某些事务失败,可以通过备忘录模式回滚到事务开始前的状态。

示例代码(Java)

以下是一个简单的备忘录模式实现示例:

java 复制代码
// 发起人类
class Originator {
    private String state;

    public void setState(String state) {
        this.state = state;
    }

    public String getState() {
        return state;
    }

    // 创建备忘录
    public Memento saveStateToMemento() {
        return new Memento(state);
    }

    // 从备忘录恢复状态
    public void getStateFromMemento(Memento memento) {
        state = memento.getState();
    }
}

// 备忘录类
class Memento {
    private String state;

    public Memento(String state) {
        this.state = state;
    }

    public String getState() {
        return state;
    }
}

// 管理者类
class Caretaker {
    private List<Memento> mementoList = new ArrayList<>();

    public void add(Memento state) {
        mementoList.add(state);
    }

    public Memento get(int index) {
        return mementoList.get(index);
    }
}

// 测试备忘录模式
public class MementoPatternDemo {
    public static void main(String[] args) {
        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker();

        // 设置状态并保存到备忘录
        originator.setState("State #1");
        caretaker.add(originator.saveStateToMemento());

        originator.setState("State #2");
        caretaker.add(originator.saveStateToMemento());

        originator.setState("State #3");
        System.out.println("Current State: " + originator.getState());

        // 恢复到之前的状态
        originator.getStateFromMemento(caretaker.get(0));
        System.out.println("Restored State: " + originator.getState());
    }
}

输出结果

复制代码
Current State: State #3
Restored State: State #1

优点

  1. 封装性:备忘录模式对外隐藏了对象的内部状态,确保只有发起人可以访问和修改这些状态。
  2. 简化撤销操作:通过保存多个备忘录,可以轻松实现多级撤销功能。
  3. 职责分离:发起人专注于状态管理,而管理者专注于备忘录的存取。

缺点

  1. 内存开销:如果需要保存的状态数据较大或频繁保存,可能会占用较多内存。
  2. 复杂性增加:引入备忘录和管理者后,代码结构会变得更加复杂。

相关推荐
桦说编程1 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
lifallen1 小时前
Java Stream sort算子实现:SortedOps
java·开发语言
IT毕设实战小研1 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
快乐的划水a1 小时前
组合模式及优化
c++·设计模式·组合模式
没有bug.的程序员2 小时前
JVM 总览与运行原理:深入Java虚拟机的核心引擎
java·jvm·python·虚拟机
甄超锋2 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
阿华的代码王国3 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
Zyy~3 小时前
《设计模式》装饰模式
java·设计模式
A尘埃3 小时前
企业级Java项目和大模型结合场景(智能客服系统:电商、金融、政务、企业)
java·金融·政务·智能客服系统
青云交3 小时前
Java 大视界 -- 基于 Java 的大数据可视化在城市交通拥堵治理与出行效率提升中的应用(398)
java·大数据·flink·大数据可视化·拥堵预测·城市交通治理·实时热力图