行为型模型 备忘录模式
应用场景
如果一个对象需要保存状态并可通过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; }