备忘录模式(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. 复杂性增加:引入备忘录和管理者后,代码结构会变得更加复杂。

相关推荐
我命由我123452 小时前
Kotlin 数据容器 - List(List 概述、创建 List、List 核心特性、List 元素访问、List 遍历)
java·开发语言·jvm·windows·java-ee·kotlin·list
武子康4 小时前
Java-80 深入浅出 RPC Dubbo 动态服务降级:从雪崩防护到配置中心秒级生效
java·分布式·后端·spring·微服务·rpc·dubbo
YuTaoShao7 小时前
【LeetCode 热题 100】131. 分割回文串——回溯
java·算法·leetcode·深度优先
源码_V_saaskw7 小时前
JAVA图文短视频交友+自营商城系统源码支持小程序+Android+IOS+H5
java·微信小程序·小程序·uni-app·音视频·交友
超浪的晨8 小时前
Java UDP 通信详解:从基础到实战,彻底掌握无连接网络编程
java·开发语言·后端·学习·个人开发
双力臂4048 小时前
Spring Boot 单元测试进阶:JUnit5 + Mock测试与切片测试实战及覆盖率报告生成
java·spring boot·后端·单元测试
Edingbrugh.南空8 小时前
Aerospike与Redis深度对比:从架构到性能的全方位解析
java·开发语言·spring
QQ_4376643149 小时前
C++11 右值引用 Lambda 表达式
java·开发语言·c++
永卿0019 小时前
设计模式-迭代器模式
java·设计模式·迭代器模式
使二颗心免于哀伤9 小时前
《设计模式之禅》笔记摘录 - 10.装饰模式
笔记·设计模式