1. 程式人生 > >行為型模型 備忘錄模式

行為型模型 備忘錄模式

style 行為型 iostream nat del 時間 blog gin -1

行為型模型 備忘錄模式

應用場景
如果一個對象需要保存狀態並可通過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; }

行為型模型 備忘錄模式