备忘录模式

Memento模式也叫备忘录模式,是行为模式之一,它的作用是保存对象内部状态,并在需要的时候(undo/roback)回复对象以前的状态。

应用场景

如果一个对象需要保存状态,并通过undo或者roback等操作回复到通知以前的状态时,可以使用Memmento模式。

  1. 一个类需要保存它的对象的状态(相当于Originator角色)
  2. 设计一个类,该类只是用来保存上述对象的状态(相当于Memento角色)
  3. 需要的时候,Caretaker角色要求Originator返回一个Memento并加以保存
  4. undoroback操作时,通过Caretaker保存的Memento恢复Originator对象的状态

Originator-原生者

需要被保存状态以便恢复的那个对象

Memento-备忘录

该对象由Originator创建,主要用来保存Originator的内部状态

Caretaker-管理者

负责在适当的时间保存/恢复Originator对象的状态

适用于:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样就可以将以后的对象状态恢复到先前保存的状态。适用于功能比较复杂的,需要记录或者维护历史属性的类。

//
// Created by andrew on 2020/11/28.
//
#include <iostream>using namespace std;// Caretaker 管理者
// Memento 备忘录class Memento{public:Memento(string name, int age){m_name = name;m_age = age;}string getName(){return m_name;}int getAge() const{return m_age;}void setName(string name){this->m_name = name;}void setAge(int age){this->m_age = age;}private:string m_name;int m_age;
};class Person{public:Person(string name, int age){m_name = name;m_age = age;}string getName(){return m_name;}int getAge() const{return m_age;}void setName(string name){this->m_name = name;}void setAge(int age){m_age = age;}// 保存,将需要的信息记录到Memento中Memento *createMemento(){return new Memento(m_name, m_age);}//还原void setMemento(Memento *memento){this->m_name = memento->getName();this->m_age = memento->getAge();}void printT(){cout << "m_name:" << m_name << "m_age:" << m_age << endl;}private:string m_name;int m_age;
};class Caretaker{public:explicit Caretaker(Memento * memento){this->memento = memento;}Memento *getMemento(){return memento;}void setMemento(Memento *memento){this->memento = memento;}private:Memento *memento;
};int main(int argc, char* argv[]){Caretaker *caretaker = nullptr;auto *p = new Person("bob", 32);p->printT();cout << "----------------------" << endl;caretaker = new Caretaker(p->createMemento());p->setAge(42);p->printT();cout << "ro back" << endl;p->setMemento(caretaker->getMemento());p->printT();cout << "memento pattern" << endl;
}

23种设计模式C++源码与UML实现--备忘录模式相关推荐

  1. 23种设计模式C++源码与UML实现--外观模式

    外观模式 facade模式也叫外观模式,是由GoF提出的23种设计模式中的一种,facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单界面.这个一致的简单的界面被称为fac ...

  2. 23种设计模式C++源码与UML实现--建造者模式

    建造者模式 代码仓库地址:建造者模式 Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种.Builder模式是一种对象创建模式之一,用来隐藏复合对象的创建过程.他把 ...

  3. 23种设计模式C++源码与UML实现--迭代器模式

    迭代器模式 Iterator模式也叫迭代模式,是行为模式之一,他把对容器种包含的内部对象的访问委让给外部类,使用Iterator按顺序进行遍历访问的设计模式. 在使用Iterator模式之前,首先应该 ...

  4. 23种设计模式C++源码与UML实现--命令模式

    命令模式 Command模式也叫命令模式,是行为设计模式的一种.Command模式通过被称为Command的类封装了对目标对象的调用行为以及调用参数. 在面向对象的程序设计中,一个对象调用另外一个对象 ...

  5. 23种设计模式C++源码与UML实现--原型模式

    原型模式 一个复杂对象,具有自我复制功能,统一一套接口. 原型模式主要面对的问题是:某些结构复杂的对象的创建工作,由于需求的变化,这些对象进场面对着剧烈的变化,但是他们却拥有比较一致的接口. 原型模式 ...

  6. 23种设计模式C++源码与UML实现--桥接模式

    桥接模式 Bridge模式,又叫做桥接模式,是构造型的设计模式之一.Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为让类承担不同的责任.它的主要特点是把抽象(Abstractio ...

  7. 23种设计模式C++源码与UML实现--状态模式

    状态模式 State模式也叫状态模式,是行为模式的一种,State模式允许通过改变对象的内部状态而改变对象的行为,这个对象变现的好像修改了它的类一样. 状态模式主要解决的事当控制一个对象状态的条件表达 ...

  8. 23种设计模式C++源码与UML实现--策略模式

    策略模式 Strategy模式也叫策略模式,是行为模式之一,它对一系列的算法加以封装,为所有算法定义一个抽象算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交给客户端决定. ...

  9. 23种设计模式C++源码与UML实现--组合模式

    组合模式 Composite模式也叫做组合模式,是构造型的设计模式之一.通过递归的手段构造树形的对象结构,并可以通过一个对象来访问整个对象树. Component树形结构的节点抽象 为所有的对象定义统 ...

最新文章

  1. 滴滴ElasticSearch平台跨版本升级以及平台重构之路
  2. python使用openweathermap API获取全世界主要城市天气信息
  3. 第十二周项目三-数组类运算的实现
  4. ios6.x越狱将不会再呈现了
  5. tcp/ip协议包含哪几层_TCP/IP协议的简单介绍
  6. boost::phoenix模块使用 istreambuf_iterator 测试 lambda 函数对象
  7. 可能是目前最详细的Redis内存模型及应用解读
  8. Java Web学习总结(20)——基于ZooKeeper的分布式session实现
  9. 华为回应“锁屏广告”事件:非官方所为
  10. java_opts gc回收器_jvm垃圾收集器与内存分配策略
  11. @程序员,沟通这项核心技能你掌握了多少?
  12. 贵州小学计算机编程比赛,2019年贵阳市中小学电脑制作活动成功举办
  13. 手动卸载金蝶旗舰版KIS软件流程
  14. MySQL数据库表结构设计优化技巧总结
  15. ApiCloud组件
  16. android慢快门相机,慢快门app-Slow Shutter Cam官网版(附教程)预约 _5577安卓网
  17. 在MobaXterm使用命令tree出现乱码解决办法locale的设定及LANG、LC_CTYPE、LC_ALL环境变量
  18. -1岁的产品经理日记——part2(笔经,群面篇)
  19. flutter dio网络请求 get post 图片上传
  20. 米卢:梅西是世界最佳 弗格森没有犯错误

热门文章

  1. 基于DirectUI搭建Windows窗体程序
  2. 基于ssm的学生成绩管理系统
  3. 暴力求解法 之 简单枚举
  4. 关于springmvc下服务器文件打包成zip格式下载功能
  5. 设计模式--建造者模式--简记
  6. mybais传入多个参数的方法
  7. leetcode-Minimum Size Subarray Sum-209
  8. 关于 CSS3 backface-visiable 与 overflow 属性的冲突
  9. 使Struts2与Servlet并存解决办法 Filter转发Servlet
  10. 编程方法学笔记:karel和java