备忘录模式:保存对象状态的设计模式

server/2024/11/13 15:15:02/

1. 引言

在软件开发中,常常需要保存一个对象的状态,以便将来能够恢复到该状态。在某些情况下,这种需求显得尤为重要,例如在撤销操作、版本控制以及游戏进度保存等场景中。备忘录模式(Memento Pattern)正是为了解决这个问题,它允许在不暴露对象实现细节的情况下保存和恢复对象的状态。

2. 备忘录模式的定义

备忘录模式是一种行为型设计模式,它通过创建一个备忘录对象来保存原对象的状态,并提供恢复原对象状态的功能。备忘录对象不对外暴露其具体实现细节,确保原对象的封装性。

3. 适用场景

  • 当需要在系统中保存对象的状态,以便在特定时刻进行恢复时。
  • 当对象的状态变化较为频繁,需要实现撤销功能时。
  • 当需要实现版本控制或历史记录功能时。

4. 结构

备忘录模式主要包括以下角色:

  • 备忘录(Memento):用于存储对象的状态信息,可以是内部状态的快照。
  • 发起人(Originator):负责创建备忘录,保存当前状态,并可以通过备忘录恢复状态。
  • 管理者(Caretaker):负责管理备忘录的生命周期,包括保存和恢复。

5. 示例代码

5.1 备忘录类

// 备忘录类
class Memento {private String state;public Memento(String state) {this.state = state;}public String getState() {return state;}
}

DiffCopyInsert

5.2 发起人类

// 发起人类
class Originator {private String state;public void setState(String state) {this.state = state;System.out.println("当前状态设置为: " + state);}public Memento createMemento() {return new Memento(state);}public void restoreMemento(Memento memento) {state = memento.getState();System.out.println("状态已恢复为: " + state);}
}

DiffCopyInsert

5.3 管理者类

import java.util.Stack;// 管理者类
class Caretaker {private Stack<Memento> mementos = new Stack<>();public void save(Originator originator) {mementos.push(originator.createMemento());}public void restore(Originator originator) {if (!mementos.isEmpty()) {originator.restoreMemento(mementos.pop());} else {System.out.println("没有备忘录可恢复");}}
}

DiffCopyInsert

5.4 客户端代码

public class MementoPatternDemo {public static void main(String[] args) {Originator originator = new Originator();Caretaker caretaker = new Caretaker();originator.setState("状态1");caretaker.save(originator);originator.setState("状态2");caretaker.save(originator);originator.setState("状态3");caretaker.restore(originator); // 恢复到状态2caretaker.restore(originator); // 恢复到状态1caretaker.restore(originator); // 尝试恢复,显示没有备忘录}
}

DiffCopyInsert

6. 优缺点

6.1 优点

  • 封装性备忘录模式使得发起人的内部状态不对外暴露,保护了对象的封装性。
  • 简化状态管理:能够轻松管理和恢复对象的状态,适合需要频繁状态保存的场景。
  • 灵活性:能够存储不同的状态快照,支持多种恢复场景。

6.2 缺点

  • 内存消耗:每次状态变化都会创建新的备忘录,可能导致内存使用增加。
  • 复杂性提高:增加了类的数量,可能使得系统的复杂性提高。
  • 不可更改性:一旦创建,备忘录的状态不能被更改,这在某些情况下可能会带来不便。

7. 总结

备忘录模式是一种有效的设计模式,能够实现对象状态的保存和恢复,在需要管理对象状态变化的场景中尤为重要。在实际开发中,合理使用备忘录模式,可以提升系统的灵活性和可维护性,满足对撤销、恢复等功能的需求。它在游戏开发、文本编辑器、以及任何需要状态保存的应用中都得到了广泛应用。


http://www.ppmy.cn/server/140996.html

相关文章

Python 数据可视化详解教程

Python 数据可视化详解教程 数据可视化是数据分析中不可或缺的一部分&#xff0c;它通过图形化的方式展示数据&#xff0c;帮助我们更直观地理解和分析数据。Python 作为一种强大的编程语言&#xff0c;拥有丰富的数据可视化库&#xff0c;如 Matplotlib、Seaborn、Plotly 和 …

react 类组件和函数组件区别

一 类组件需要使用this关键字来访问props和状态&#xff0c;而函数组件则可以直接访问这些值。原来只有类组件可以使用的特性&#xff0c;比如状态和生命周期方法&#xff0c;现在函数组件通过Hooks也可以使用。函数组件通常更简洁&#xff0c;更易于测试和理解。类组件目前仍…

什么是红黑树

红黑树是一种自平衡的二叉查找树&#xff0c;在计算机科学中常用于组织数据&#xff0c;如数字块等&#xff0c;其典型的用途是实现关联数组。以下是对红黑树的详细介绍&#xff0c;以及左旋、右旋、变色等操作的解析&#xff1a; 一、红黑树简介 起源与命名&#xff1a;红黑树…

算法训练(leetcode)二刷第二十一天 | 491. 非递减子序列、*46. 全排列、*47. 全排列 II、D

刷题记录 491. 非递减子序列*46. 全排列*47. 全排列 IID 491. 非递减子序列 leetcode题目地址 题目提供的数据有重复&#xff0c;但结果集中不可有重复组合&#xff0c;且不允许排序&#xff0c;因此需要借助Set或额外的hash表进行标记当前层是否使用了相同元素。 时间复杂度…

SSRF〈2〉

SSRF的进阶 1.Gopher协议的利用 1.gopher协议可以通过url指向指定IP端口发送任意内容&#xff0c;模拟大多数TCP协议&#xff0c;是SSRF中的一把利刃。 gopher协议URL&#xff1a; gopher://<host>:<port>/_<url编码的TCP数据> 这个url编码的TCP数据是goph…

华为HarmonyOS借助AR引擎帮助应用实现虚拟与现实交互的能力3-获取设备位姿

设备位姿描述了物体在真实世界中的位置和朝向。AR Engine提供了世界坐标下6自由度&#xff08;6DoF&#xff09;的位姿计算&#xff0c;包括物体的位置&#xff08;沿x、y、z轴方向位移&#xff09;和朝向&#xff08;绕x、y、z轴旋转&#xff09;。通过AR Engine&#xff0c;您…

开源竞争-大数据项目期末考核

开源竞争&#xff1a; 自己没有办法完全掌握技术的时候就开源这个技术&#xff0c;培养出更多的技术依赖&#xff0c;让更多人完善你的技术&#xff0c;那么这不就是在砸罐子吗&#xff1f;一个行业里面总会有人砸罐子的&#xff0c;你不如先砸还能听个想。 客观现实&#xf…

Java实战项目-基于Spring Boot+vue框架的健康健身追踪系统

大家好&#xff0c;我是stormjun&#xff0c;今天为大家带来的是Java实战项目-基于Spring Bootvue框架的健康健身追踪系统。该系统采用 Java 语言 开发&#xff0c;MySql 作为数据库&#xff0c;系统功能完善 &#xff0c;实用性强 &#xff0c;可供大学生实战项目参考使用。 博…