当前位置: 首页 > article >正文

【设计模式-行为型】备忘录模式

一、什么是备忘录模式

        来到备忘录模式了,这个模式我感觉相对简单一些,就是备份,或者快照。跟前面一样为了加深理解,我们引入一个电影情结来说明啥是备忘录模式,以来加深大家对备忘录模式的认识。那么,在电影中谁是此模式应用的王者呢。我想起一位,不知道大家有没有看过一个极其经典的电影,星爷的《大话西游》。在电影《大话西游》中,至尊宝利用月光宝盒不断穿越到紫霞仙子自杀前的时间段,试图改变结局。这种时间穿越和状态恢复的机制也可以类比为备忘录模式。

        至尊宝:“般若波罗蜜~~~~~~~~~”

        二当家:“哇,又升仙啦!咦?为什么要说‘又’?”

        至尊宝通过月光宝盒(管理者)回到过去,每次穿越都会恢复到之前保存的状态(备忘录),从而尝试改变故事的走向。备忘录模式(Memento Pattern) 是一种行为型设计模式,它允许在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。

二、为什么使用备忘录模式

        那么我们拿《月光宝盒》来说一下为啥要使用备忘录模式

1. 需要保存对象的历史状态:如文本编辑器中的撤销、恢复功能。在《大话西游》中,至尊宝通过月光宝盒保存了多个历史状态,每次回到过去都是对这些历史状态的恢复。

2. 需要在程序运行时回滚对象状态:如游戏中存储和恢复玩家进度。在电影中,至尊宝利用月光宝盒不断回到过去,每次回到过去都是对之前状态的回滚。

3. 希望避免暴露对象的实现细节:通过备忘录隐藏对象的内部状态。在电影中,月光宝盒作为备忘录,保存了至尊宝的状态,而至尊宝自己和观众都无法直接访问这些状态,只能通过月光宝盒进行恢复。

        备忘录模式通过在不破坏封装性的前提下,捕获并保存对象的内部状态,使得对象可以在需要时恢复到之前的状态。这种模式特别适用于需要撤销操作、历史记录功能或状态恢复的场景。在电影《大话西游》中,至尊宝利用月光宝盒不断回到过去,试图改变结局,这种机制很好地体现了备忘录模式的核心思想。

三、备忘录模式示例

1. 定义备忘录接口(Memento)(定义了备忘录的行为
public interface Memento {
    // 备忘录接口,用于保存和恢复状态
}
2. 实现具体备忘录类(ConcreteMemento)(月光宝盒
  • 月光宝盒:用于存储至尊宝的内部状态,通常是一个简单的数据类。月光宝盒对至尊宝以外的其他对象是不可变的。

public class TimeMemento implements Memento {
    private String state;

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

    public String getState() {
        return state;
    }
}
3. 定义发起人(Originator)(至尊宝(孙悟空)
  • 至尊宝(孙悟空):负责创建备忘录对象,记录当前时刻的内部状态。至尊宝通过月光宝盒保存和恢复自己的状态
public class BrocadeHorse {
    private String state;

    public void setState(String state) {
        this.state = state;
        System.out.println("至尊宝的状态已更新为: " + state);
    }

    public String getState() {
        return state;
    }

    public Memento saveStateToMemento() {
        // 保存当前状态到备忘录
        return new TimeMemento(state);
    }

    public void getStateFromMemento(Memento memento) {
        // 从备忘录恢复状态
        setState(((TimeMemento) memento).getState());
    }
}
4. 定义管理者类(Caretaker)(猪八戒(二当家)
  • 猪八戒(二当家):负责保存和管理备忘录,但不能直接操作备忘录的内容。猪八戒通过月光宝盒帮助至尊宝恢复状态。

public class MoonlightBox {
    private Memento memento;

    public void saveState(BrocadeHorse horse) {
        // 保存状态
        memento = horse.saveStateToMemento();
        System.out.println("月光宝盒保存了至尊宝的状态。");
    }

    public void restoreState(BrocadeHorse horse) {
        // 恢复状态
        horse.getStateFromMemento(memento);
        System.out.println("月光宝盒恢复了至尊宝的状态。");
    }
}
5. 场景重现
public class Main {
    public static void main(String[] args) {
        // 创建至尊宝对象
        BrocadeHorse brocadeHorse = new BrocadeHorse();

        // 创建月光宝盒对象
        MoonlightBox moonlightBox = new MoonlightBox();

        // 至尊宝的状态变化
        brocadeHorse.setState("初次见到紫霞仙子");

        // 保存状态
        moonlightBox.saveState(brocadeHorse);

        // 至尊宝的状态变化
        brocadeHorse.setState("紫霞仙子自杀");

        // 恢复状态
        moonlightBox.restoreState(brocadeHorse);

        // 至尊宝的状态变化
        brocadeHorse.setState("再次尝试拯救紫霞仙子");

        // 保存状态
        moonlightBox.saveState(brocadeHorse);

        // 恢复状态
        moonlightBox.restoreState(brocadeHorse);
    }
}



//日志输出
至尊宝的状态已更新为: 初次见到紫霞仙子
月光宝盒保存了至尊宝的状态。
至尊宝的状态已更新为: 紫霞仙子自杀
月光宝盒恢复了至尊宝的状态。
至尊宝的状态已更新为: 再次尝试拯救紫霞仙子
月光宝盒保存了至尊宝的状态。
月光宝盒恢复了至尊宝的状态。

原文地址:https://blog.csdn.net/qq_36038282/article/details/145366333
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/522756.html

相关文章:

  • 具身智能研究报告
  • 【NLP251】NLP RNN 系列网络
  • doris:Bitmap
  • 【PyQt5】数据库连接失败: Driver not loaded Driver not loaded
  • 重构字符串(767)
  • 【性能调优】高性能实践
  • 《CPython Internals》读后感
  • 使用Python和Qt6创建GUI应用程序--关于Qt的一点介绍
  • WordPress event-monster插件信息泄露漏洞复现(CVE-2024-11396)(附脚本)
  • 【MySQL】 数据类型
  • Hive详细讲解-各类函数速通
  • GO 库与框架篇
  • Vue 3 30天精进之旅:Day 06 - 表单输入绑定
  • 【愚公系列】《循序渐进Vue.js 3.x前端开发实践》027-组件的高级配置和嵌套
  • Java数据库操作指南:快速上手JDBC【学术会议-2025年数字化教育与信息技术(DEIT 2025】
  • 如何利用AI工具来进行数据分析
  • 落地 轮廓匹配
  • 数据结构课程设计(三)构建决策树
  • 当当网近30日热销图书的数据采集与可视化分析(scrapy+openpyxl+matplotlib)
  • unity商店中的A* Pathfinding Project插件,判断两个点之间能否正常导航通行?
  • Airflow:精通Airflow任务依赖
  • 如何解决小尺寸图像分割中的样本不均衡问题
  • 指针的介绍2前
  • 【JavaEE进阶】应用分层
  • 使用Ollama 在Ubuntu运行deepseek大模型:以DeepSeek-coder为例
  • 包管理工具随记