行为型模型 备忘录模式
应用场景
如果一个对象需要保存状态并可通过undo或rollback等操作恢复到以前的状态时,可以使用Memento模式。
1)一个类需要保存它的对象的状态(相当于Originator角色)
2)设计一个类,该类只是用来保存上述对象的状态(相当于Memento角色)
3)需要的时候,Caretaker角色要求Originator返回一个Memento并加以保存
4)undo或rollback操作时,通过Caretaker保存的Memento恢复Originator对象的状态
Originator(原生者)
需要被保存状态以便恢复的那个对象。
Memento(备忘录)
该对象由Originator创建,主要用来保存Originator的内部状态。
Caretaker(管理者)
负责在适当的时间保存/恢复Originator对象的状态。
适用于:
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样就可以将以后的对象状态恢复到先前保存的状态。
适用于功能比较复杂的,但需要记录或维护属性历史的类;或者需要保存的属性只是众多属性中的一小部分时Originator可以根据保存的Memo还原到前一状态。
/*** 行为型模型 备忘录模式* Memento模式也叫备忘录模式,是行为模式之一,它的作用是保存对象的内部状态,并在需要的时候(undo/rollback)恢复对象以前的状态。**/#define _CRT_SECURE_NO_WARNINGS#include <iostream> #include <string>class MememTo { public:MememTo(std::string name, int age){m_name = name;m_age = age;}void setName(std::string name){m_name = name;}std::string getName(){return m_name;}void setAge(int age){m_age = age;}int getAge(){return m_age;} private:std::string m_name;int m_age; };class Person { public:Person(std::string name, int age){m_name = name;m_age = age;}void setName(std::string name){m_name = name;}std::string getName(){return m_name;}void setAge(int age){m_age = age;}int getAge(){return m_age;}void printT(){std::cout << "name: " << m_name << " age: " << m_age << std::endl;}// 创建备份MememTo * createMememTo(){return new MememTo(m_name, m_age);}// 恢复备份void SetMememTo(MememTo *mememto){m_name = mememto->getName();m_age = mememto->getAge();}private:std::string m_name;int m_age; };// 管理者 class Caretaker { public:Caretaker(MememTo * mememto){m_mememto = mememto;}MememTo * getMememTo(){return m_mememto;}void setMememTo(MememTo *mememto){m_mememto = mememto;} private:MememTo * m_mememto; };void mytest() {Person * p1 = new Person("张三", 18);p1->printT();// 创建备份MememTo *membak = p1->createMememTo();p1->setAge(28);p1->printT();// 恢复备份p1->SetMememTo(membak);p1->printT();delete p1;p1 = nullptr;delete membak;membak = nullptr;// 通过管理者进行备份恢复Person * p2 = new Person("李四", 25);p2->printT();// 创建备份Caretaker * ct = new Caretaker(p2->createMememTo());p2->setAge(29);p2->printT();// 恢复备份p2->SetMememTo(ct->getMememTo());p2->printT();delete p2;p2 = nullptr;delete ct->getMememTo();delete ct;ct = nullptr;return; }int main() {mytest();system("pause");return 0; }