23种设计模式C++源码与UML实现--备忘录模式
备忘录模式
Memento
模式也叫备忘录模式,是行为模式之一,它的作用是保存对象内部状态,并在需要的时候(undo
/roback
)回复对象以前的状态。
应用场景
如果一个对象需要保存状态,并通过undo
或者roback
等操作回复到通知以前的状态时,可以使用Memmento
模式。
- 一个类需要保存它的对象的状态(相当于
Originator
角色) - 设计一个类,该类只是用来保存上述对象的状态(相当于
Memento
角色) - 需要的时候,
Caretaker
角色要求Originator
返回一个Memento
并加以保存 undo
或roback
操作时,通过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实现--备忘录模式相关推荐
- 23种设计模式C++源码与UML实现--外观模式
外观模式 facade模式也叫外观模式,是由GoF提出的23种设计模式中的一种,facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单界面.这个一致的简单的界面被称为fac ...
- 23种设计模式C++源码与UML实现--建造者模式
建造者模式 代码仓库地址:建造者模式 Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种.Builder模式是一种对象创建模式之一,用来隐藏复合对象的创建过程.他把 ...
- 23种设计模式C++源码与UML实现--迭代器模式
迭代器模式 Iterator模式也叫迭代模式,是行为模式之一,他把对容器种包含的内部对象的访问委让给外部类,使用Iterator按顺序进行遍历访问的设计模式. 在使用Iterator模式之前,首先应该 ...
- 23种设计模式C++源码与UML实现--命令模式
命令模式 Command模式也叫命令模式,是行为设计模式的一种.Command模式通过被称为Command的类封装了对目标对象的调用行为以及调用参数. 在面向对象的程序设计中,一个对象调用另外一个对象 ...
- 23种设计模式C++源码与UML实现--原型模式
原型模式 一个复杂对象,具有自我复制功能,统一一套接口. 原型模式主要面对的问题是:某些结构复杂的对象的创建工作,由于需求的变化,这些对象进场面对着剧烈的变化,但是他们却拥有比较一致的接口. 原型模式 ...
- 23种设计模式C++源码与UML实现--桥接模式
桥接模式 Bridge模式,又叫做桥接模式,是构造型的设计模式之一.Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为让类承担不同的责任.它的主要特点是把抽象(Abstractio ...
- 23种设计模式C++源码与UML实现--状态模式
状态模式 State模式也叫状态模式,是行为模式的一种,State模式允许通过改变对象的内部状态而改变对象的行为,这个对象变现的好像修改了它的类一样. 状态模式主要解决的事当控制一个对象状态的条件表达 ...
- 23种设计模式C++源码与UML实现--策略模式
策略模式 Strategy模式也叫策略模式,是行为模式之一,它对一系列的算法加以封装,为所有算法定义一个抽象算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交给客户端决定. ...
- 23种设计模式C++源码与UML实现--组合模式
组合模式 Composite模式也叫做组合模式,是构造型的设计模式之一.通过递归的手段构造树形的对象结构,并可以通过一个对象来访问整个对象树. Component树形结构的节点抽象 为所有的对象定义统 ...
最新文章
- 滴滴ElasticSearch平台跨版本升级以及平台重构之路
- python使用openweathermap API获取全世界主要城市天气信息
- 第十二周项目三-数组类运算的实现
- ios6.x越狱将不会再呈现了
- tcp/ip协议包含哪几层_TCP/IP协议的简单介绍
- boost::phoenix模块使用 istreambuf_iterator 测试 lambda 函数对象
- 可能是目前最详细的Redis内存模型及应用解读
- Java Web学习总结(20)——基于ZooKeeper的分布式session实现
- 华为回应“锁屏广告”事件:非官方所为
- java_opts gc回收器_jvm垃圾收集器与内存分配策略
- @程序员,沟通这项核心技能你掌握了多少?
- 贵州小学计算机编程比赛,2019年贵阳市中小学电脑制作活动成功举办
- 手动卸载金蝶旗舰版KIS软件流程
- MySQL数据库表结构设计优化技巧总结
- ApiCloud组件
- android慢快门相机,慢快门app-Slow Shutter Cam官网版(附教程)预约 _5577安卓网
- 在MobaXterm使用命令tree出现乱码解决办法locale的设定及LANG、LC_CTYPE、LC_ALL环境变量
- -1岁的产品经理日记——part2(笔经,群面篇)
- flutter dio网络请求 get post 图片上传
- 米卢:梅西是世界最佳 弗格森没有犯错误