最新要闻
- 每日快看:墨水人_墨水
- 即时:今日描写冬季的古诗名句_描写冬季的古诗
- 仙剑系列首款开放世界游戏!《仙剑世界》公布首支预告
- 每日看点!用科技诠释豪华!一文看懂AITO问界M9有多少硬核“黑科技”
- 环球信息:西安一极氪001全国首烧?极氪回应:初步排除电池起火
- 全球最新:价格崩了!全新日产天籁直降4.9万:不到14万可买合资中型轿车
- 全球快报:上海车展宝马Mini展台被曝区别对待 冰激淋只给外国人免费吃
- 环球速讯:我想听张惠妹的歌_渴了 张惠妹演唱歌曲
- 今热点:蜂巢能源“龙鳞甲汽车电池”亮相:续航超1000km 热失控不起火
- 全球报道:清热降火 一朵泡一杯!徽春堂金丝皇菊10.9元大促(2袋约50朵)
- 华为智能驾驶总裁:华为智能驾驶体验明显好于特斯拉
- 小米13 Ultra京东全版本卖断货!很多米粉跟员工要F码
- 【天天快播报】加量还减价!小米平板6 Pro预售战报出炉:2023年双平台预售量新高
- 到2028年AIoT平台市场价值249亿美元
- 最新消息:系统之家win7纯净版官网下载_系统之家win7纯净版官网
- 环球焦点!昆明高新区持续优化知识产权创新环境
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
当前短讯!【备忘录设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
(资料图)
简介
备忘录模式(Memento Pattern)是一种结构型设计模式。这种模式就是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住,并放在外部存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。备忘录模式常常与命令模式和迭代子模式一同使用。
备忘录模式的角色有三个:备忘录(Memento)角色、发起人(Originator)角色、负责人(Caretaker)角色
备忘录模式是由发起人(Originator)对象负责生成状态快照,其他对象不可修改状态。再将对象状态的副本存储在一个名为备忘录(Memento)的特殊对象中。除了创建备忘录的对象外,任何对象都不能访问备忘录的内容。其他对象必须使用指定接口与备忘录进行交互,它们可以获取快照的元数据(创建时间和操作名称等),但不能获取快照中原始对象的状态。
这种限制策略允许你将备忘录保存在通常被称为负责人(Caretakers)的对象历史中。由于负责人仅通过受限接口与备忘录互动,故其无法修改存储在备忘录内部的状态。同时,发起人拥有对备忘录所有成员的访问权限,从而能随时恢复其以前的某个状态。
作用
- 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。
- 实现了内部状态的封装,除了创建它的发起人之外,其他对象都不能够访问这些状态信息,也不需要关心状态的保存细节。
- 简化了发起人角色,发起人不需要管理和保存其内部状态的各个备份,所有状态信息都保存在备忘录中,并由负责人进行管理,符合单一职责原则。
实现步骤
- 创建备忘录Memento,用来记录操作状态数据的实体类。
- 创建发起人角色Originator,状态的制造者,也是备忘录的生成者,负责将状态写入到一个新备忘录。
- 创建负责人角色Caretaker,用来保存和读取备忘录的历史记录,所有备忘录均可以保存在历史中,以便恢复。
- 客户调用方通过Originator来生成备忘录,再通过Caretaker读取和恢复备忘录历史记录。
UML
Java代码
具体备忘录
// Memento.java 备忘录(Memento)角色,负责存储发起人传入的状态public class Memento { private String state; public Memento(String state) { System.out.println(this.getClass().getName() + "::Memento() [state = " + state + "]"); this.state = state; } public String getState() { return state; } public void setState(String state) { this.state = state; }}
发起人
// Originator.java 发起人(Originator)负责生成状态快照,即利用一个新备忘录对象将自己的内部状态存储起来public class Originator { private String state; // 每次创建一个新备忘录来保存状态 public Memento saveMemento() { System.out.println(this.getClass().getName() + "::saveMemento() [state = " + state + "]"); return new Memento(state); } // 从备忘录中恢复状态 public void restoreMemento(Memento memento) { this.state = memento.getState(); } public String getState() { return state; } public void setState(String state) { this.state = state; }}
负责人类
// Caretaker.java 负责人(Caretaker)角色,只负责保存备忘录记录,不能修改备忘录对象的内容public class Caretaker { // 备忘录可以是一个记录,也可以就是一个对象,根据业务场景设置 private List mementoList = new ArrayList(); public void add(Memento memento) { System.out.println(this.getClass().getName() + "::add() [memento = " + memento.getClass().getName() + "]"); mementoList.add(memento); } public Memento get(int index) { return mementoList.get(index); } public List getMementoList() { return this.mementoList; }}
测试调用
/* * 备忘录模式是在不暴露对象实现细节的情况下保存和恢复对象之前的状态。 * 先声明发起人Originator,再声明负责人Caretaker,发起人生成备忘录Memento * 通过负责人则保存备忘录历史记录,读取备忘录由负责人来完成。 */ Originator originator = new Originator(); Caretaker careTaker = new Caretaker(); // 发起人产生一个状态 originator.setState("state1"); // 覆盖了状态,那么前面的状态未保存 originator.setState("state2"); // 发起人生成备忘录,一般添加时直接保存即可 Memento memento = originator.saveMemento(); // 负责人保添加备忘录历史记录 careTaker.add(memento); // 直接生成备忘录并添加到负责人的备忘录列表 originator.setState("state3"); careTaker.add(originator.saveMemento()); originator.setState("state4"); careTaker.add(originator.saveMemento()); System.out.println("发起人当前的状态: " + originator.getState()); // 发起人通过负责人那里取出状态 originator.restoreMemento(careTaker.get(0)); System.out.println("第一个保存的状态: " + originator.getState()); originator.restoreMemento(careTaker.get(1)); System.out.println("第二个保存的状态: " + originator.getState()); // 遍历全部备忘录 for (int i = 0; i < careTaker.getMementoList().size(); i++) { // 外部一般不直接访问备忘录里面的状态,而是逐个恢复备忘录,再取出状态来 originator.restoreMemento(careTaker.get(i)); System.out.println("state: " + i + ")" + originator.getState()); }
JavaScript代码
具体备忘录
// Memento.js 备忘录(Memento)角色,负责存储发起人传入的状态// 备忘录(Memento)角色,负责存储发起人传入的状态export class Memento { constructor(state) { console.log(this.constructor.name + "::Memento() [state = " + state + "]") this.state = state } getState() { return this.state } setState(state) { this.state = state }}
发起人
// Originator.js 发起人(Originator)负责生成状态快照,即利用一个新备忘录对象将自己的内部状态存储起来import { Memento } from "./Memento.js"export class Originator { constructor() { this.state = undefined } // 每次创建一个新备忘录来保存状态 saveMemento() { console.log( this.constructor.name + "::saveMemento() [state = " + this.state + "]" ) return new Memento(this.state) } // 从备忘录中恢复状态 restoreMemento(memento) { this.state = memento.getState() } getState() { return this.state } setState(state) { this.state = state }}
负责人类
// Caretaker.js 负责人(Caretaker)角色,只负责保存备忘录记录,不能修改备忘录对象的内容export class Caretaker { constructor() { // 备忘录可以是一个记录,也可以就是一个对象,根据业务场景设置 this.mementoList = [] } add(memento) { console.log( this.constructor.name + "::add() [memento = " + memento.constructor.name + "]" ) this.mementoList.push(memento) } get(index) { return this.mementoList[index] } getMementoList() { return this.mementoList }}
测试调用
import { Originator } from "../src/Originator.js"import { Caretaker } from "../src/Caretaker.js"export function test() { /* * 备忘录模式是在不暴露对象实现细节的情况下保存和恢复对象之前的状态。 * 先声明发起人Originator,再声明负责人Caretaker,发起人生成备忘录Memento * 通过负责人则保存备忘录历史记录,读取备忘录由负责人来完成。 */ const originator = new Originator() const careTaker = new Caretaker() // 发起人产生一个状态 originator.setState("state1") // 覆盖了状态,那么前面的状态未保存 originator.setState("state2") // 发起人生成备忘录,一般添加时直接保存即可 const memento = originator.saveMemento() // 负责人保添加备忘录历史记录 careTaker.add(memento) // 直接生成备忘录并添加到负责人的备忘录列表 originator.setState("state3") careTaker.add(originator.saveMemento()) originator.setState("state4") careTaker.add(originator.saveMemento()) console.log("发起人当前的状态: " + originator.getState()) // 发起人通过负责人那里取出状态 originator.restoreMemento(careTaker.get(0)) console.log("第一个保存的状态: " + originator.getState()) originator.restoreMemento(careTaker.get(1)) console.log("第二个保存的状态: " + originator.getState()) // 遍历全部备忘录 for (let i = 0; i < careTaker.getMementoList().length; i++) { // 外部一般不直接访问备忘录里面的状态,而是逐个恢复备忘录,再取出状态来 originator.restoreMemento(careTaker.get(i)) console.log("state: " + i + ")" + originator.getState()) }}// 执行测试;(function () { console.log("test start:") test()})()
更多语言版本
不同语言实现设计模式:https://github.com/microwind/design-pattern
关键词:
-
当前短讯!【备忘录设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
简介备忘录模式(MementoPattern)是一种结构型设计模式。这种模式就是在不破坏封装的条件下,将一个对...
来源: 当前短讯!【备忘录设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
全球讯息:JavaScript 九九乘法表
每日快看:墨水人_墨水
即时:今日描写冬季的古诗名句_描写冬季的古诗
仙剑系列首款开放世界游戏!《仙剑世界》公布首支预告
每日看点!用科技诠释豪华!一文看懂AITO问界M9有多少硬核“黑科技”
环球信息:西安一极氪001全国首烧?极氪回应:初步排除电池起火
全球最新:价格崩了!全新日产天籁直降4.9万:不到14万可买合资中型轿车
全球快报:上海车展宝马Mini展台被曝区别对待 冰激淋只给外国人免费吃
进程处于临界区是什么状态?进程处于临界区可以调度吗?
iu14D2N.tmp是什么意思?iu14D2N.tmpiu14D2N.tmp可以删除吗?
miui开发版内测和公测哪个好?miui开发版内测更新频率是多长时间?
拆机版单反是什么意思?拆机版单反与套机的区别是什么?
苹果IPAD用哪个助手好?苹果ipad型号大全及价格表
当前速读:后台性能测试规范
世界聚焦:福建省练习题
Oracle 备忘清单_开发速查表分享
环球速讯:我想听张惠妹的歌_渴了 张惠妹演唱歌曲
今热点:蜂巢能源“龙鳞甲汽车电池”亮相:续航超1000km 热失控不起火
全球报道:清热降火 一朵泡一杯!徽春堂金丝皇菊10.9元大促(2袋约50朵)
华为智能驾驶总裁:华为智能驾驶体验明显好于特斯拉
小米13 Ultra京东全版本卖断货!很多米粉跟员工要F码
【天天快播报】加量还减价!小米平板6 Pro预售战报出炉:2023年双平台预售量新高
到2028年AIoT平台市场价值249亿美元
环球速讯:前端跨域解决方案——JSONP
最新消息:系统之家win7纯净版官网下载_系统之家win7纯净版官网
环球焦点!昆明高新区持续优化知识产权创新环境
“吉林一号”卫星传图!从太空视角俯瞰春耕锦绣画卷
【世界新要闻】“四驱性能 两驱能耗、价格”降维打击!哈弗枭龙MAX千岛湖试驾
当前时讯:4499元!Redmi X 85英寸电视上市:120Hz高刷、3+32GB大存储
曝iPhone 15 Pro Max独占潜望长焦:苹果选了两家供应商
天天速讯:日本报告称:新电池专利中国在数量上领先 日美在质量上更佳
2023年最新微信小程序抓包教程
当前速递!【读财报】上市险企2022年年报:5家偿付率均下滑 中国平安归母净利润及内含价值位列第一
全球要闻:特斯拉称今年是一个独特的机遇:降价利润依然可控 我们成本领先
世界视点!湖北巴东发现罕见白麂:古代称为“瑞兽”
女子晒衣服不慎10楼跌落悬挂2楼 现场可怕:官方提醒提高安全意识
当前聚焦:2999元 索尼首款专业开放式监听耳机MDR-MV1发布:沉浸感无敌
当前消息!别吐槽网速慢了!2023年第一季度全球宽带最快城市在我国北京
学好虚拟化,首先要学Linux
【焦点热闻】多地展开公司债发行人自查自纠 四大事项成关注重点
这下跟安卓真没区别!iOS 17确定支持第三方应用商店 苹果被逼
环球热门:12-240四摄8焦段!小米13 Ultra影像功能深度解析
李想吐槽变色天窗玻璃如同卫生间隐私膜 理想汽车坚持用电动遮阳帘
看点:学系统集成项目管理工程师(中项)系列09_收尾管理
全球观热点:索尼发布4K HDR旗舰监视器:双液晶面板 峰值亮度4000尼特
每日热文:GPT-4可能对经济领域的近期影响,以及远期对全球可能产生的深远影响。
天天百事通!去年我是怎么解决团队问题的
新日2022年净利同比暴增1326.25%!卖了257万辆电动自行车
焦点热文:在上海车展逛了两天 愣是找不出一辆值得写的油车!
世界今日报丨爷青回!电影《灌篮高手》今日上映:等了20多年的全国大赛开打
焦点快看:等等党赢了!华为Mate 50系列官方降价:最高便宜800元
AutoGPT是什么?超简单安装使用教程
今日精选:微信小程序、uniapp、vue生命周期钩子函数
【全球新视野】PS5 Pro为期不远 索尼PS5完全不缺货:黄牛被逼低价清仓
环球微动态丨03 设置工作环境与环境(二)GRUB二级引导器
环球观点:新能源车不好卖!宁德时代一线工人:做四休三想加班 没活干盼着忙起来
热议:高性能HBM显存芯片:被韩国企业垄断了
5999元安卓影像之王 小米13 Ultra优化跟上了:1天内两次升级MIUI14
全球观察:关于shell变量值的截取-通过分隔符-去除前后匹配到的内容
高毅资产冯柳、重阳投资裘国根“相逢”海康威视
环球快播:华为“黑科技”悉数上车!AITO全尺寸旗舰SUV问界M9开订:50-60万元
宝马喊话“我们的家在中国” 网友神点评:求生欲太强
夏季空调开启前 这些准备工作必须做到位
当前通讯!估计雷军都没想到 小米摄影手柄被用在了友商手机上
A卡大面积降价后 NVIDIA终于坐不住了:RTX 4090/4080破发
世界热讯:牛顿迭代法求方程根
世界聚焦:【财经分析】信用债表现依旧向好 机构建议关注久期策略
2023年第15期用工快讯
世界短讯!女子入职58天迟到21次不满被辞要仲裁:还要求公司赔偿一个半月工资
世界关注:90后程序员辞职带妈妈锻炼 半年瘦20斤:血压血脂好多了
天天热头条丨山东济宁两辆重型货车相撞车头瞬间解体 官方通报:事故致7死10伤
报道:汽车召回王诞生 竟然是特斯拉 马斯克:不服!
焦点速读:时代的眼泪 DVD也没人看了:奈飞关闭25年历史的光碟邮寄业务
目标古币、老物件,这个贼“老宅淘宝”
【全球时快讯】网红自嗨锅 被罚款800000元!
【聚看点】【中介者设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
速递!AIRIOT物联网平台助力油库自动化升级 实现业务场景全覆盖
视焦点讯!md文件图片上传
热点评!第二季度白银价格如何表现?
孟晚舟:华为让欧拉、鸿蒙等开源 促进国产生态、操作系统繁荣
天天视讯!男子被宠物魔鬼鱼刺伤险丧命 专家:鲨鱼同类 含神经毒素
世界微动态丨苹果WWDC将发自研xrOS:这导致iOS 17/iPadOS 17更新大幅缩水
天天即时看!5.39万起!吉利几何熊猫mini小黄鸭限定版上市:极其可爱
【环球新视野】国产车崛起!反超大众成销量第一 比亚迪:为了这两年 准备了二十年
【世界新要闻】为适应被查处后生活 一贪官提前吃减肥餐
今头条!山东苯乙烯市场行情小幅走低
全球播报:day02-功能实现02
消息!Kubesphere部署Ruoyi(一):为什么是Ruoyi和Kubesphere?
今头条!TC (Teamcenter) 许可证解决方案
简讯:Windows 10开发教程_编程入门自学教程_菜鸟教程-免费教程分享
全球热门:已致29人不幸遇难!长峰医院火灾事故伤亡情况、事故原因初步调查结果公布
世界热点!100%自主指令集!国产龙芯CPU进驻国家重点工程
焦点观察:日本、韩国车企遭重击:美国花式打击 电动汽车补贴无视日/韩系 毫无存在感
环球热门:NASA失控卫星将坠落地球自毁 有可能砸伤人:几率比遭雷击高得多
当前消息!全国首例 长沙一男子植入戒酒芯片:立即起效 管用5个月
比5G好用10倍 华为持续推动5.5G时代建设:万兆网速体验
每日观察!中国科学家有望率先在国际上探测到超大质量双黑洞的并合
2023年中国兽药行业细分市场分析 生物制品发展向好【组图】
【Jmeter】基础介绍-详细