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

备忘录模式

目录

1.核心思想

个人理解

2.成员

3.优点

4.代码实现

4.1 备忘录

4.2 发起人

4.3 看护者

4.4 测试类


1.核心思想

不用知道对象内部,实现对象的保存和删除后的恢复

个人理解

结合栈或者队列,去达到获取某一个特定位置的元素,换成备忘录模式,就是获取某一个阶段的对象状态

2.成员

Originator(发起人):负责创建一个备忘录对象,用于保存当前的内部状态。它也可以使用备忘录对象来恢复之前的状态。

Memento(备忘录):用于存储发起人的内部状态。备忘录对象不暴露任何关于发起人状态的具体实现细节。

Caretaker(看护者):负责保存备忘录对象。看护者无法对备忘录的内容进行修改,只能存取备忘录对象。

3.优点

封装内部状态:

备忘录模式通过备忘录对象封装了对象的内部状态,保护了对象的内部结构和实现细节。这样,外部代码无需了解对象的内部状态即可保存和恢复对象的状态。

支持状态恢复:

该模式允许对象在特定时间点保存其状态,并能够在需要时恢复到这些保存的状态。这对于实现“撤销”和“恢复”功能非常有用,例如文本编辑器中的撤销操作,或者游戏中的存档和恢复功能。

分离状态管理:

备忘录模式将状态的保存和恢复从对象的业务逻辑中分离出来,使得对象可以专注于自身的核心功能,而看护者类负责管理状态的保存和恢复。这种分离提高了代码的可维护性和可读性。

历史记录管理:

看护者类可以保存多个备忘录对象,从而管理对象的历史状态。这样可以实现对对象状态的历史回溯,支持复杂的撤销和重做操作。

4.代码实现

4.1 备忘录

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

4.2 发起人

//发起人
public 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();}
}

4.3 看护者

//看护者
public class Caretaker {private final Stack<Memento> mementoStack = new Stack<>();public void saveMemento(Memento memento) {mementoStack.push(memento);}public Memento getLastMemento() {return mementoStack.pop();}
}

4.4 测试类

public class Test {public static void main(String[] args) {Originator originator = new Originator();Caretaker caretaker = new Caretaker();// 设置初始状态并保存originator.setState("状态 #1");caretaker.saveMemento(originator.saveStateToMemento());// 修改状态并保存originator.setState("状态 #2");caretaker.saveMemento(originator.saveStateToMemento());// 再次修改状态originator.setState("状态 #3");System.out.println("当前状态: " + originator.getState()); // 打印当前状态// 从备忘录中恢复到上一个状态originator.getStateFromMemento(caretaker.getLastMemento());System.out.println("恢复到: " + originator.getState()); // 打印恢复后的状态// 从备忘录中恢复到之前的状态originator.getStateFromMemento(caretaker.getLastMemento());System.out.println("恢复到: " + originator.getState()); // 打印恢复后的状态}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 使用GenAI做Discord舆情分析对游戏运营的帮助
  • 技术学习笔记 1:C++标准库异常类(c++中怎样用自己错误信息交给try catch捕获)
  • 餐饮连锁加盟的网页UI,如果不大气,谁能相信你的品牌力
  • Package.Json 参数配置理解用途
  • C:关于位操作符:、|、^、~的一些应用
  • 百日筑基第三十七天-阿里开发手册编程规约
  • 编程实践|如何用 MoonBit 实现 diff(三)
  • 使用css在照片右上角设置缎带效果
  • 请以零基础学Python 之 第二十讲 分组和贪婪匹配
  • 从新手到高手:Scala函数式编程完全指南,Scala 文件 I/O(27)
  • 【LLM】-10-部署llama-3-chinese-8b-instruct-v3 大模型
  • 类似redmine的项目管理系统有哪些?10款软件测评
  • 基础跟张宇,强化换武忠祥可行吗?会不会漏什么?
  • Flask目录结构路由重定向简单实例讲解——轻量级的 Python Web 框架
  • 【数据结构】——堆的实现与算法
  • JavaScript-如何实现克隆(clone)函数
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 2017前端实习生面试总结
  • 3.7、@ResponseBody 和 @RestController
  • 77. Combinations
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • Javascript基础之Array数组API
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Laravel核心解读--Facades
  • rc-form之最单纯情况
  • Sequelize 中文文档 v4 - Getting started - 入门
  • Solarized Scheme
  • Vue2.x学习三:事件处理生命周期钩子
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 从零搭建Koa2 Server
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 浅谈web中前端模板引擎的使用
  • 深度学习在携程攻略社区的应用
  • 微信开源mars源码分析1—上层samples分析
  • 再次简单明了总结flex布局,一看就懂...
  • Hibernate主键生成策略及选择
  • 回归生活:清理微信公众号
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • (2)Java 简介
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (待修改)PyG安装步骤
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (详细文档!)javaswing图书管理系统+mysql数据库
  • (转)Linq学习笔记
  • *算法训练(leetcode)第四十五天 | 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿
  • .libPaths()设置包加载目录
  • .mysql secret在哪_MySQL如何使用索引
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .Net(C#)自定义WinForm控件之小结篇
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件