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

备忘录模式(Memento Pattern)

定义

备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不破坏封装性的前提下捕获一个对象的内部状态,并在以后将对象恢复到该状态。备忘录模式通常用于实现撤销操作(Undo)或历史记录(History)等功能。

在备忘录模式中,我们定义三个角色:

  1. Originator:记录当前时刻它的内部状态,并可使用备忘录对象恢复到之前的状态。
  2. Memento:负责存储Originator对象的内部状态,并可防止Originator以外的对象访问备忘录。
  3. Caretaker:负责保存好备忘录对象,不能对备忘录的内容进行操作或检查。

示例

下面是一个C++的备忘录模式示例:

#include <iostream>  
#include <string>  
#include <vector>  // Memento类,存储Originator的内部状态  
class Memento {  
public:  std::string state; // 假设Originator有一个string类型的状态  // 构造函数,用于从Originator获取状态  Memento(const std::string& state) : state(state) {}  
};  // Originator类,负责创建Memento,并可以使用Memento恢复状态  
class Originator {  
private:  std::string state; // Originator的内部状态  public:  // 获取当前状态  std::string getState() const {  return state;  }  // 设置状态  void setState(const std::string& newState) {  state = newState;  std::cout << "Originator state changed to: " << state << std::endl;  }  // 创建Memento对象,保存当前状态  Memento* createMemento() {  return new Memento(state);  }  // 使用Memento恢复状态  void restoreMemento(const Memento* memento) {  state = memento->state;  std::cout << "Originator state restored to: " << state << std::endl;  }  
};  // Caretaker类,负责保存Memento对象  
class Caretaker {  
private:  std::vector<Memento*> mementos; // 存储Memento对象的容器  public:  // 添加Memento到容器中  void addMemento(Memento* memento) {  mementos.push_back(memento);  }  // 获取Memento对象,用于恢复状态  Memento* getMemento(int index) {  if (index >= 0 && index < mementos.size()) {  return mementos[index];  }  return nullptr;  }  
};  int main() {  Originator* originator = new Originator();  Caretaker* caretaker = new Caretaker();  // 设置Originator的初始状态  originator->setState("Initial State");  // 保存当前状态到Caretaker  caretaker->addMemento(originator->createMemento());  // 修改Originator的状态  originator->setState("Modified State");  // 使用Caretaker中的Memento恢复Originator的状态  originator->restoreMemento(caretaker->getMemento(0));  // 清理资源  delete originator;  delete caretaker;  return 0;  
}

在这个示例中:

  • Memento 类存储了 Originator 的内部状态,即一个字符串 state
  • Originator 类有一个私有成员 state,并提供了 setState 和 getState 方法来修改和获取这个状态。它还提供了 createMemento 方法来创建一个包含当前状态的 Memento 对象,以及 restoreMemento 方法来根据 Memento 对象恢复状态。
  • Caretaker 类负责保存 Memento 对象,并提供 addMemento 和 getMemento 方法来添加和获取 Memento 对象。

在 main 函数中,我们创建了一个 Originator 对象和一个 Caretaker 对象。我们首先设置了 Originator 的初始状态,并将这个状态保存到 Caretaker 中。然后我们修改了 Originator 的状态,并使用 Caretaker 中保存的 Memento 对象来恢复 Originator 的状态。

这个示例展示了如何使用备忘录模式来保存和恢复对象的状态。在实际应用中,备忘录模式常用于实现撤销操作、历史记录、事务处理等需要保存和恢复对象状态的功能。

http://www.lryc.cn/news/310327.html

相关文章:

  • LeetCode 刷题 [C++] 第121题.买卖股票的最佳时机
  • ORACLE 基础
  • Adobe illustrator CEP插件调试
  • 学会玩游戏,智能究竟从何而来?
  • Unity 常用操作
  • 【计算机网络_应用层】协议定制序列化反序列化
  • Doris实战——银联商务实时数仓构建
  • 代码随想录算法训练营第七天
  • 文件操作和IO(2):Java中操作文件
  • 人工智能-零基础
  • 网络爬虫部分应掌握的重要知识点
  • git命令笔记
  • 微服务day03-Nacos配置管理与Nacos集群搭建
  • DFS剪枝
  • 基于SpringBoot多模块项目引入其他模块时@Autowired无法注入
  • 每日一题——LeetCode1566.重复至少K次且长度为M的模式
  • 代码随想录刷题笔记-Day27
  • 【小沐学GIS】QGIS安装和入门使用
  • 黑马程序员——接口测试——day03——Postman断言、关联、参数化
  • Unreal触屏和鼠标控制旋转冲突问题
  • Vins-Moon配准运行
  • MSCKF3讲:后端理论推导(上)
  • 群控代理IP搭建教程:打造一流的网络爬虫
  • 【IO流系列】字符流练习(拷贝、文件加密、修改文件数据)
  • 华为云磁盘挂载
  • 通过大语言模型理解运维故障:评估和总结
  • SVN教程-SVN的基本使用
  • 【MySQL】数据查询——DQL基本数据库查询
  • 机器人持续学习基准LIBERO系列9——数据集轨迹查看
  • uniapp中canvas的基础使用