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

行为型设计模式——备忘录模式

文章目录备忘录模式结构实现特点备忘录模式备忘录模式提供了一种状态恢复的实现机制使得用户可以方便地回到一个特定的历史步骤当新的状态无效或者存在问题时可以使用暂时存储起来的备忘录将状态复原当前很多软件都提供了撤销( Undo)操作其中就使用了备忘录模式。备忘录模式又称为标记Token模式。备忘录模式是一种软件设计模式它提供了将对象恢复到其先前状态通过回滚撤消的能力在不破坏封装的前提下捕获一个对象的内部状态并在该对象之外保存这个状态这样可以在以后将对 象恢复到原先的状态。结构在备忘录模式结构图中包含如下几个角色Originator原发器它是一个普通类可以创建一个备忘录并存储它的当前内部状态也可以使用备忘录来恢复其内部状态一般将需要保存内部状态的类设计为原发器。Memento备忘录存储原发器的内部状态根据原发器来决定保存哪些内部状态。备忘录的设计一般可以参考原发器的设计根据实际需要确定备忘录类中的属性。需要注意的是除了原发器本身与负责人类之外备忘录对象不能直接供其他类使用原发器的设计在不同的编程语言中实现机制会有所不同。Caretaker负责人负责人又称为管理者它负责保存备忘录但是不能对备忘录的内容进行操作或检查。在负责人类中可以存储一个或多个备忘录对象它只负责存储对象而不能修改对象也无须知道对象的实现细节。注意在设计备忘录类时需要考虑其封装性除了Originator类不允许其他类来调用备忘录类Memento的构造函数与相关方法如果不考虑封装性允许其他类调用setState()等方法将导致在备忘录中保存的历史状态发生改变通过撤销操作所恢复的状态就不再是真实的历史状态备忘录模式也就失去了本身的意义。在使用Java语言实现备忘录模式时一般通过将Memento类与Originator类定义在同一个包中来实现封装在Java语言中可使用默认访问标识符来定义Memento类即保证其包内可见。实现// 历史备忘录类classHistory{public:History(string msg):m_msg(msg){}stringgetHistory(){returnm_msg;}private:string m_msg;};// 鬼子classJiaoPenJi{public://代表鬼子在我国犯下了某一个罪行参数对应的就是相关的描述voidsetState(string msg){m_msgmsg;}//得到鬼子犯下的罪行的相关信息stringgetState(){returnm_msg;}voidbeiDaddyDa(){cout脚盆鸡被兔子狠狠地揍了又揍, 终于承认了它们之前不承认的这些罪行: endl;}//将鬼子的罪行封装成一个历史对象并通过返回值传出History*saveHistory(){returnnewHistory(m_msg);}//从一个历史对象中读出相关的历史信息voidgetStateFromHistory(History*history){m_msghistory-getHistory();}private:string m_msg;};// 记录者classRecorder{public://添加历史信息并保存voidaddHistory(intindex,History*history){m_history.insert(make_pair(index,history));}//从备份信息中得到想要的历史信息History*getHistory(intindex){if(m_history.find(index)!m_history.end()){returnm_history[index];}returnnullptr;}private:mapint,History*m_history;};intmain(){vectorstringmsg{不承认偷了中国的中医!!!,不承认发动了侵华战争!!!,不承认南京大屠杀!!!!,不承认琉球群岛和钓鱼岛是中国的领土!!!,不承认731部队的细菌和人体试验!!!,不承认对我国妇女做出畜生行为!!!,不承认从中国掠夺的数以亿计的资源和数以万计的文物!!!,我干的龌龊事儿罄竹难书, 就是不承认......};JiaoPenJi*jiaopennewJiaoPenJi;Recorder*recordernewRecorder;// 把小日本的罪行记录下来for(inti0;imsg.size();i){jiaopen-setState(msg.at(i));recorder-addHistory(i,jiaopen-saveHistory());}jiaopen-beiDaddyDa();for(inti0;imsg.size();i){jiaopen-getStateFromHistory(recorder-getHistory(i));cout -- jiaopen-getState()endl;}return0;}特点⚠️备忘录模式在很多软件的使用过程中普遍存在但是在应用软件开发中它的使用频率并不太高因为现在很多基于窗体和浏览器的应用软件并没有提供撤销操作。主要优点它提供了一种状态恢复的实现机制使得用户可以方便地回到一个特定的历史步骤当新的状态无效或者存在问题时可以使用暂时存储起来的备忘录将状态复原。备忘录实现了对信息的封装一个备忘录对象是一种原发器对象状态的表示不会被其他代码所改动。备忘录保存了原发器的状态采用列表、堆栈等集合来存储备忘录对象可以实现多次撤销操作。资源消耗过大如果需要保存的原发器类的成员变量太多就不可避免需要占用大量的存储空间每保存一次对象的状态都需要消耗一定的系统资源。适用环境保存一个对象在某一个时刻的全部状态或部分状态这样以后需要时它能够恢复到先前的状态实现撤销操作。防止外界对象破坏一个对象历史状态的封装性避免将对象历史状态的实现细节暴露给外界对象。
http://www.gsyq.cn/news/1328632.html

相关文章:

  • Perplexity社会新闻搜索响应延迟突增47%?独家披露其底层新闻图谱更新机制与3类高危缓存失效场景
  • CANN ops-rand性能优化指南:如何在Ascend 950上实现高效随机数生成
  • Ubuntu/Debian上apt-get install报错‘pkgProblemResolver’?别慌,试试aptitude这个老伙计
  • PCL距离图像边界提取详解:区分障碍物、阴影和面纱点的实用技巧
  • 基于AI利率敏感性模型的黄金波动研究:美债收益率飙升与通胀升温下的黄金跌超100美元机制分析
  • Claude Code用户如何通过Taotoken解决访问不稳定与Token不足问题
  • 基础设施监控:全面监控基础设施状态
  • 2026年深圳24小时宠物医院推荐:瑞派福华龙华,宠物体检/宠物内科/宠物外科/宠物手术/宠物急诊公司精选 - 品牌推荐官
  • 深入解析AKShare开源财经数据接口库:高性能金融数据采集架构设计
  • 从ZZULIOJ到LeetCode:数组合并的“双指针”套路,一篇就够(附C/Java/Python三语实现)
  • onlinetools API接口完全指南:自动化安全测试的终极解决方案
  • 【Perplexity新闻搜索权威白皮书】:基于127家媒体源实测的环境适配黄金标准
  • 不踩坑!2026 钢格板厂家实力排名TOP5 :多场景优质企业全面选购指南 - 速递信息
  • 2026年全国医用微动力系统与无刷电机供应商深度评测|手术动力设备精准适配完全指南 - 企业名录优选推荐
  • Ormar 性能优化:10 个提升数据库查询效率的技巧
  • 暗黑破坏神2存档修改器:释放你的游戏创造力
  • 数字生产实践Codex:AI 编程助手进化到桌面办公智能体
  • 福州晋安鼓山李国秀保洁:长乐居家开荒保洁公司选哪家 - LYL仔仔
  • drf-nested-routers测试指南:确保嵌套路由稳定性的完整方案
  • 2026年5月最新乌鸫科技面经:低代码主子表、RBAC、统一支付接口设计都问到了
  • D1027UK,具备极低反向传输电容与13dB高增益特性的射频晶体管
  • 社保基金管理系统全解析:核心痛点、核心功能、应用场景、价值、案例、FAQ(2026)
  • PPTXjs:告别Office依赖!用纯JavaScript在浏览器中完美预览PPTX文件
  • 若依分离板部署到本地
  • MyBatis-Plus详解(速成版)
  • 告别定时器PWM!用STM32F407的IIC接口驱动PCA9685控制多路舵机全攻略
  • 2026年新疆穴位压力刺激贴选购指南|禹孚生物无源物理理疗专家深度评测 - 优质企业观察收录
  • 本地构建大模型服务
  • 什么产品去皱纹效果最好 CA逆时光两个月后脸部细纹变少 - 全网最美
  • OBS多平台直播终极指南:obs-multi-rtmp插件5分钟快速上手