news 2026/5/8 16:46:03

设计模式(C++)-行为型模式-备忘录模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
设计模式(C++)-行为型模式-备忘录模式

设计模式(C++)-行为型模式-备忘录模式

一、备忘录模式概述

备忘录模式是一种行为型模式,允许在不破坏封装性的前提下,捕获并保存一个对象的内部状态,以便以后可以恢复到这个状态。
核心思想

三个关键角色:1.Originator(原发器):需要保存状态的对象2.Memento(备忘录):存储Originator内部状态的对象3.Caretaker(负责人):负责保存和恢复备忘录,但不操作备忘录内容

二、备忘录模式UML类图

备忘录场景

备忘录模式的典型应用场景包括:
撤销操作:在编辑器中,用户可能希望撤销最近的几次操作。
游戏存档:在游戏过程中,玩家可能希望保存当前进度,以便之后可以继续游戏。
事务处理:在数据库事务中,如果事务失败,需要恢复到事务之前的状态。

三、代码实现

//memento.h#pragmaonce/* 备忘录模式(Memento Pattern) 是一种软件设计模式,属于行为型模式。 它主要用于保存一个对象的某个状态,以便在需要时可以恢复到这个状态。 备忘录模式通常用于实现撤销功能,或者在某些情况下,实现对象的快照功能。 备忘录模式涉及三个角色: Originator(发起人):创建一个备忘录Memento,用以记录当前时刻的内部状态,并可以使用Memento恢复内部状态。 Memento(备忘录):负责存储Originator的内部状态,并可以防止外部直接修改这个状态。 Caretaker(管理者):负责保存好Memento,不能对Memento的内容进行操作或检查,只能进行保存或丢弃。 备忘录模式的典型应用场景包括: 撤销操作:在编辑器中,用户可能希望撤销最近的几次操作。 游戏存档:在游戏过程中,玩家可能希望保存当前进度,以便之后可以继续游戏。 事务处理:在数据库事务中,如果事务失败,需要恢复到事务之前的状态。 */#include<vector>#include<memory>#include<iostream>classMemento;//发起人 类负责创建备忘录,并根据备忘录恢复状态class{public:Originator(intstate):state_(state){}//创建备忘录std::shared_ptr<Memento>saveStateToMemento();//恢复状态voidgetStateFromMemento(std::shared_ptr<Memento>memento);//打印当前状态voidprintState();//用于改变状态的方法voidsetState(intnewState);//获取当前状态intgetState()const;private:intstate_;};//备忘录类,负责存储发起人的内部状态classMemento{public:explicitMemento(intstate):state_(state){}intgetState();private:intstate_;};//管理者类,负责保存备忘录classCaretaker{public://保存备忘录voidadd(std::shared_ptr<Memento>memonto);//根据索引获取备忘录std::shared_ptr<Memento>get(intindex);private:std::vector<std::shared_ptr<Memento>>mementoList_;};voidtestMemento();//memento.cc#include"memento.h"std::shared_ptr<Memento>Originator::saveStateToMemento(){returnstd::make_shared<Memento>(state_);}voidOriginator::getStateFromMemento(std::shared_ptr<Memento>memento){state_=memento->getState();}voidOriginator::printState(){std::cout<<"Current state: "<<state_<<std::endl;}voidOriginator::setState(intnewState){state_=newState;}intOriginator::getState()const{returnstate_;}intMemento::getState(){returnstate_;}voidCaretaker::add(std::shared_ptr<Memento>memonto){mementoList_.push_back(memonto);}std::shared_ptr<Memento>Caretaker::get(intindex){returnmementoList_.at(index);}voidtestMemento(){std::cout<<"=================memento start==============="<<std::endl;//创建发起人对象,初始状态为10Originator*originator=newOriginator(10);Caretaker caretaker;//创建管理者对象//保存状态originator->printState();caretaker.add(originator->saveStateToMemento());//改变状态originator->setState(20);originator->printState();//恢复状态originator->getStateFromMemento(caretaker.get(0));originator->printState();//释放发起人对象deleteoriginator;originator=nullptr;std::cout<<"=================memento end==============="<<std::endl;}

四、优缺点总结

优点:

  • 封装性好:不暴露对象内部状态
  • 可恢复性:支持状态回滚
  • 简化原发器:状态保存逻辑分离
  • 支持撤销/重做:适合实现编辑器功能

缺点:

  • 内存消耗:大量备忘录可能占用过多内存
  • 性能考虑:状态序列化/反序列化开销
  • 深拷贝问题:复杂对象的深度复制
  • 线程安全:多线程环境下的状态管理
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 16:45:30

三步实现网页视频智能下载:VideoDownloadHelper完整指南

三步实现网页视频智能下载&#xff1a;VideoDownloadHelper完整指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾在浏览网页时&am…

作者头像 李华
网站建设 2026/5/8 16:44:50

创业团队如何利用Taotoken统一管理多个AI模型API密钥

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 创业团队如何利用Taotoken统一管理多个AI模型API密钥 对于快速迭代的创业团队而言&#xff0c;大模型已成为产品开发与运营中不可或…

作者头像 李华
网站建设 2026/5/8 16:44:46

对比直接采购,通过Taotoken聚合平台使用大模型的经济性分析

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 对比直接采购&#xff0c;通过Taotoken聚合平台使用大模型的经济性分析 当技术团队需要集成多个不同厂商的大模型能力时&#xff0…

作者头像 李华
网站建设 2026/5/8 16:43:47

终极指南:5步掌握WeChatExporter微信聊天记录永久备份

终极指南&#xff1a;5步掌握WeChatExporter微信聊天记录永久备份 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter WeChatExporter是一款开源免费的微信聊天记录导出工具&…

作者头像 李华
网站建设 2026/5/8 16:43:37

taotoken稳定直连服务在海外业务部署中的实际体验

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 taotoken稳定直连服务在海外业务部署中的实际体验 在部署需要调用大模型API的海外业务时&#xff0c;网络连接的稳定性与可靠性是技…

作者头像 李华
网站建设 2026/5/8 16:43:29

苹果高通博弈:从专利战到自研基带,揭秘供应链与技术自主权之争

1. 苹果与高通的恩怨&#xff1a;一场重塑行业格局的深度博弈 智能手机行业的风向&#xff0c;往往由几家巨头之间的微妙关系所左右。2017年前后&#xff0c;苹果与高通之间那场举世瞩目的法律战与供应链博弈&#xff0c;就是一个教科书级的案例。这远非一场简单的专利费纠纷&a…

作者头像 李华