本文共 3113 字,大约阅读时间需要 10 分钟。
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。
意图: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。主要解决: 所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。 这样可以在以后将对象恢复到原先保存的状态。何时使用: 很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作。 能够恢复到他原先的状态,使得他有"后悔药"可吃。如何解决: 通过一个备忘录类专门存储对象状态。 关键代码: 客户不与备忘录类耦合,与备忘录管理类耦合。 应用实例: 1、后悔药。 2、打游戏时的存档。 3、Windows 里的 ctri + z。 4、IE 中的后退。 4、数据库的事务管理。优点: 1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。 2、实现了信息的封装,使得用户不需要关心状态的保存细节。 缺点: 消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。使用场景: 1、需要保存/恢复数据的相关状态场景。 2、提供一个可回滚的操作。注意事项: 1、为了符合迪米特原则,还要增加一个管理备忘录的类。 2、为了节约内存,可使用原型模式+备忘录模式。#pragma once#include#include // 备忘录class MementoPattern{public:public: MementoPattern() {} MementoPattern(std::string name, int age) :m_name(name), m_age(age) {} ~MementoPattern() {} void setName(std::string name) { m_name = name; } void setAge(int age) { m_age = age; } std::string getName(void) { return m_name; } int getAge(void) { return m_age; }private: std::string m_name; int m_age;};//人class Person{public: Person() {} Person(std::string name, int age) :m_name(name), m_age(age) { m_mementopattern = nullptr; } ~Person() {} void setName(std::string name) { m_name= name; } void setAge(int age) { m_age= age; } std::string getName(void) {return m_name;} int getAge(void) { return m_age; } // 创建备忘录 MementoPattern* creatMemento(void) { m_mementopattern= new MementoPattern(this->m_name,this->m_age); return m_mementopattern; } // 从备忘录恢复 void replyMemento(void) { this->m_name= (this->m_mementopattern->getName()); this->m_age= (this->m_mementopattern->getAge()); } // 重载一个版本 void replyMemento(MementoPattern* mementopattern) { this->m_name = mementopattern->getName(); this->m_age = mementopattern->getAge(); } void printInf(void) { std::cout << "name:"< <<" age:" < << std::endl; }private: std::string m_name; int m_age; MementoPattern* m_mementopattern; // 自己管理一个备忘录protected:};// 备忘录管理者,另外管理class Caretaker{public: Caretaker(MementoPattern * mementopattern):m_mementopattern(mementopattern){} ~Caretaker() {} MementoPattern* getMemento(void) { return m_mementopattern; } void setMemento(MementoPattern* mementopattern) { m_mementopattern = mementopattern; }private: MementoPattern * m_mementopattern; // 备忘录protected:};
#include "MementoPattern.h"
#include#include #include "MementoPattern.h"int mainTest1(void){ Person* person = new Person("张三",29); person->printInf(); // 设置备忘 person->creatMemento(); // 更该数据 person->setAge(0); person->setName(" "); person->printInf(); // 从备忘录回复 person->replyMemento(); person->printInf(); return 0;}int mainTest2(void){ // 声明一个备忘录管理者 Caretaker* caretaker = nullptr; Person* person = new Person("张三", 29); person->printInf(); // 设置备忘,同时创建备忘录管理者 caretaker = new Caretaker(person->creatMemento()); // 更该数据 person->setAge(0); person->setName(" "); person->printInf(); // 从备忘录回复 person->replyMemento(caretaker->getMemento()); person->printInf(); return 0;}int main(void){ //mainTest1(); mainTest2(); system("pause"); return 0;}
转载地址:http://cemsi.baihongyu.com/