概念
Memento模式也叫备忘录模式,是行为模式之一,它的作用是保存对象的内部状态,并在需要的时候(undo/rollback)恢复对象以前的状态。
应用场景
如果一个对象需要保存状态并可通过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还原到前一状态。
案例
//备份、还原功能
#include <iostream> using namespace std; #include "string" class MememTo { public: MememTo(string name, int age) { this->m_name = name; this->m_age = age; } void setName(string name) { this->m_name = name; } string getName() { return m_name; } void setAge(int age) { this->m_age = age; } int getAge() { return m_age; } protected: private: string m_name; int m_age; }; class Person { public: Person(string name, int age) { this->m_name = name; this->m_age = age; } void setName(string name) { this->m_name = name; } string getName() { return m_name; } void setAge(int age) { this->m_age = age; } int getAge() { return m_age; } void printT() { cout << "name: " << m_name << "age: " << m_age << endl; } public: //创建备份 MememTo *createMememTo() { return new MememTo(m_name, m_age); } //恢复备份 void SetMememTo(MememTo *memto) { m_name = memto->getName(); m_age = memto->getAge(); } protected: private: string m_name; int m_age; }; //管理者 class Caretaker { public: Caretaker(MememTo *mem) { this->m_memto = mem; } MememTo *getMememTo() { return m_memto; } void setMememTo(MememTo *mem) { this->m_memto = mem; } protected: private: MememTo *m_memto; }; void main23_01() { Person *p = new Person("张三", 18); p->printT(); //创建备份 Caretaker *ct = new Caretaker(p->createMememTo()); p->setAge(28); p->printT(); //恢复信息 p->SetMememTo(ct->getMememTo()); p->printT(); delete p; delete ct->getMememTo(); return ; } void main23_02() { Person *p = new Person("张三", 18); p->printT(); //创建备份 MememTo * membak = p->createMememTo(); p->setAge(28); p->printT(); //恢复信息 p->SetMememTo(membak); p->printT(); delete p; delete membak; } void main() { //main23_01(); main23_02(); system("pause"); }
原文地址:https://www.cnblogs.com/gd-luojialin/p/10358072.html
时间: 2024-11-08 03:35:11