设计模式-备忘录模式(Memento Pattern)

2023-11-12

前言

备忘录模式(Memento Pattern)是一种行为型设计模式,它用于捕获和存储对象的内部状态,以便在以后可以恢复到先前的状态。备忘录模式允许对象在不暴露其内部状态的情况下保存和还原状态,从而提供了一种简单的方式来实现撤销和恢复功能。

在本篇博客中,我们将详细介绍备忘录模式的概念,并提供一个简单的Java代码示例来演示如何实现它。

一、备忘录模式的概念

备忘录模式的核心思想是将对象的状态保存在一个备忘录对象中,并将备忘录对象存储在一个外部管理器中,以便随时可以将对象恢复到先前的状态。备忘录模式包含以下几个要素:

  1. 发起人(Originator):负责创建备忘录对象,将自己的状态保存到备忘录中,并从备忘录中恢复状态。

  2. 备忘录(Memento):负责存储发起人的内部状态。备忘录对象通常具有只读接口,只能由发起人访问。

  3. 管理者(Caretaker):负责存储和管理备忘录对象。管理者不应该访问或修改备忘录的内容,只负责存储和提供备忘录对象给发起人。

二、备忘录模式的实现

让我们通过一个简单的示例来演示备忘录模式的实现。我们将创建一个文本编辑器应用程序,其中用户可以编辑文本,并且可以随时撤销和恢复编辑操作。

首先,我们定义备忘录对象 TextEditorMemento,它保存文本编辑器的状态:

class TextEditorMemento {
    private String text;

    public TextEditorMemento(String text) {
        this.text = text;
    }

    public String getText() {
        return text;
    }
}

然后,我们创建文本编辑器 TextEditor,它包含编辑文本和撤销操作:

class TextEditor {
    private String text;

    public void setText(String text) {
        this.text = text;
    }

    public String getText() {
        return text;
    }

    public TextEditorMemento save() {
        return new TextEditorMemento(text);
    }

    public void restore(TextEditorMemento memento) {
        text = memento.getText();
    }
}

接下来,我们编写客户端代码来测试备忘录模式:

public class MementoPatternDemo {
    public static void main(String[] args) {
        TextEditor textEditor = new TextEditor();
        textEditor.setText("Hello, World!");

        // 保存状态
        TextEditorMemento memento = textEditor.save();

        // 修改文本
        textEditor.setText("New Text");

        // 恢复到先前状态
        textEditor.restore(memento);

        System.out.println("Current Text: " + textEditor.getText()); // 输出: Current Text: Hello, World!
    }
}

在这个示例中,我们创建了一个文本编辑器 TextEditor,它可以保存和恢复状态。客户端可以使用 save 方法保存当前状态,并使用 restore 方法恢复到先前的状态,从而实现了撤销和恢复功能。

三、备忘录优缺点

备忘录模式(Memento Pattern)是一种有用的设计模式,但它也有一些明显的优点和缺点。让我们首先讨论一下备忘录模式的优点:

优点:

  1. 状态保存和恢复:备忘录模式允许对象在不暴露其内部状态的情况下保存和恢复状态。这对于实现撤销、恢复和历史记录等功能非常有用。

  2. 简化发起人:备忘录模式使得发起人(对象需要保存状态的对象)的代码变得更加简洁,因为状态的管理和存储被委托给备忘录对象。

  3. 多状态保存:发起人可以创建多个备忘录对象,从而可以保存多个不同时间点的状态。这使得可以在不同的时间点之间切换状态。

  4. 封装性:备忘录对象封装了状态信息,只有发起人可以访问备忘录的内容,从而保护了状态的完整性和隐私性。

缺点:

  1. 内存消耗:如果备忘录对象较大或备忘录的数量较多,可能会占用大量内存。需要谨慎管理备忘录的生命周期,确保及时销毁不再需要的备忘录。

  2. 复杂性增加:在某些情况下,引入备忘录模式可能会增加代码的复杂性。特别是在需要频繁保存和恢复状态的情况下,可能会引入额外的复杂性。

  3. 性能开销:备忘录模式涉及创建、保存和恢复状态的操作,可能会引入一定的性能开销。对于性能要求很高的应用程序,需要仔细考虑备忘录的使用。

  4. 不适用于所有情况:备忘录模式主要用于需要保存和恢复对象状态的情况。对于不需要这种功能的情况,引入备忘录模式可能会显得过于繁琐。

总的来说,备忘录模式是一种有助于实现状态保存和恢复的强大模式,特别适用于需要实现撤销、恢复和历史记录等功能的应用程序。但需要权衡其优点和缺点,并根据具体需求来决定是否使用备忘录模式。在某些情况下,可能有更简单的方法来实现相同的功能。

总结

备忘录模式是一种非常有用的设计模式,它允许对象保存和还原状态,从而提供了撤销和恢复功能。这在许多应用程序中都是非常有用的,例如文本编辑器、游戏中的进度保存等。备忘录模式的关键思想是将状态分离和封装在备忘录对象中,以便于管理和恢复。当需要实现撤销和恢复功能时,备忘录模式是一个强大的工具。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式-备忘录模式(Memento Pattern) 的相关文章

随机推荐

  • android播放gif图片,Android SurfaceView 播放gif

    Android SurfaceView 是Android系统中的高级组件 它有自己的绘制界面 可以在一个独立的线程进行UI的绘制 因此不会阻塞主线程 这也是我们使用SuefaceView播放gif图片的原因 先简单说一下思路 gif图其实就
  • Openwrt编译python3时出现错误:No rule to make target `package//host/compile'

    步骤 1 在package目录下添加python3 包含Makefile files和相关patches文件 2 执行make package python3 compile V s make 1 No rule to make targe
  • 纯css3制作手风琴选项卡

    前言 平时工作中时常会制作手风琴以及选项卡 制作这些我们首先想到的是使用 js 操作 而其实 css3 也是可以完成 不需要使用 js 下面我们就使用 css3 完成 效果如下 手风琴 结构代码如下 ul class box li li u
  • 美团-分布式会话跟踪系统架构设计与实践

    前言 随着美团点评的业务发展 公司的分布式系统变得越来越复杂 我们亟需一个工具能够梳理内部服务之间的关系 感知上下游服务的形态 比如一次请求的流量从哪个服务而来 最终落到了哪个服务中去 服务之间是RPC调用 还是HTTP调用 一次分布式请求
  • Hibernate中用hql查询部分字段

    hql查询单表部分字段 在hibernate中 用hql语句查询实体类 采用list方法的返回结果为一个List 该List中封装的对象分为以下三种情况 1 查询全部字段的情况下 如 from 实体类 list中封装的对象为实体类本身 各属
  • 如何禁用GeForce Experience的奖励广告

    NVIDIA s GeForce Experience software now displays notification advertisements for free to play games If you don t want n
  • 系统错误!!!VCRUNTIME140.dll找不到的解决方案

    相信各位很多一定有过这样的经历 当你打开steam 打算开开心心玩一场游戏 当你打开电脑 想登个QQ 然后 太淦了 对不对 笔者百度了一下 教程挺多 不过试试我的也是可以的 至少我觉得简单实用吧 而且以后电脑软件有什么小毛病都可以试试 通过
  • 使用百度API进行情感分析(python)(二)

    编写代码 将代码中的token值改为上一篇得到的Access token值 即可 该值的时间期限约是一个月 一个月之后需要重新获取Access token值 获取方法与之前相同 代码示例 import re import requests
  • 基于.Net的权限管理快速开发框架

    一 项目简介 基于 Net的权限管理快速开发框架 二 实现功能 支持基础功能 系统设置 角色管理 用户管理 组织机构 字典管理 支持功能模块 权限管理 url权限 按钮权限 支持定时任务 在线的定时任务 任务调度 执行结果 支持基本的日志管
  • C++实例(十二)图形绘制

    一 特殊曲线 绘制蜗牛线 绘制贝塞尔曲线 拖动绘制曲线 绘制正弦曲线 绘制立体模型 交叉线条 绘制尼哥米德蚌线 艺术图案万花筒 绘制抛物线 等电位面图 沙丘图案 绘制艺术图案 立体三棱锥 二 图形基础 创建不同的画刷 指定颜色填充矩形区域
  • 更多提高正则表达式效率的方法

    原文 http wyzws iteye com blog 1274020 让匹配更快失败 尤其是匹配很长的字符串时 匹配失败的位置要比成功的位置多得多 以简单 必须的字元开始 排除明显不匹配的位置 如锚点 或 特殊字符 x或 u263A 字
  • win32 消息循环

    windows系统把应用程序的输入事件传递给各个窗口 每个窗口有一个函数 称为窗口消息处理函数 窗口消息处理函数处理各种用户输入 处理完成后再将控制权交还给系统 窗口消息处理函数一般是在注册一个窗口的时候指定的 在Windows下 只有那些
  • linear-gradient为啥只能background不能background-color

    background 可以设置 背景颜色 背景图片 定位等 而background color 只能设置 背景颜色 设置background color aaa 此时仅仅改专变了背景色 但此时有一个默认的的background repeat
  • 什么是OAuth

    什么是OAuth OAuth 全称 Open Authorization 中文翻译开放授权 是一种基于令牌的身份验证 允许组织跨第三方服务共享信息 而无需公开用户的用户名 密码 本质上 OAuth是为第三方服务提供令牌的中间人 该令牌只允许
  • android按日期函数查询,Android开发中SQLite存储时间和按日期函数查询

    Android开发中SQLite存储时间和按日期函数查询 Android开发中SQLite存储时间和按日期函数查询 在Android开发中 在消息模块中 消息做数据库缓存处理 排序查询或指定时间查询需要用时间和日期函数 本篇简括 存储时间字
  • QT 完美实现圆形按钮

    QT 版本 5 6 0 官方的按钮有些普通 如果我们想要换成自己喜欢的按钮而却无从下手 那么请继续往下阅读 皮一下 首先 可以在网络上搜索一下自己喜欢的按钮图形 或者可以自行绘制 我以下面的图形为例 开始制作 一 建立 QT 工程 并加入图
  • 基于画布canvas进行图片压缩

    Canvas 压缩图片的原理主要是通过重新绘制图片 调整图片质量或大小来达到压缩图片的目的 具体实现步骤如下 1 使用 JavaScript 中的 Image 对象将图片加载到内存中 var img new Image img src im
  • mkp勒索病毒怎么处理

    目录 前言 简介 一 mkp勒索病毒的特征 二 mkp后缀勒索病毒是如何传播的 三 如何预防与处理mkp勒索病毒攻击 前言 简介 当今 勒索病毒已成为企业网络安全的一大威胁 而其中mkp勒索病毒则是一种新近出现的变种 与其他勒索病毒一样 m
  • 关于redis密码

    如何更改密码 直接配置文件里更改 配置文件里开放 requirepass 之后客户端更改 用Redis命令查询密码 可以使用以下Redis命令来查询密码 config get requirepass 得到的结果第一行固定是requirepa
  • 设计模式-备忘录模式(Memento Pattern)

    文章目录 前言 一 备忘录模式的概念 二 备忘录模式的实现 三 备忘录优缺点 优点 缺点 总结 前言 备忘录模式 Memento Pattern 是一种行为型设计模式 它用于捕获和存储对象的内部状态 以便在以后可以恢复到先前的状态 备忘录模