博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《设计模式》学习笔记——备忘录模式
阅读量:4110 次
发布时间:2019-05-25

本文共 3113 字,大约阅读时间需要 10 分钟。

        备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。

意图:
    在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
主要解决:
    所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
    这样可以在以后将对象恢复到原先保存的状态。
何时使用:
    很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作。
    能够恢复到他原先的状态,使得他有"后悔药"可吃。
如何解决:
    通过一个备忘录类专门存储对象状态。
关键代码:
    客户不与备忘录类耦合,与备忘录管理类耦合。    
应用实例:
    1、后悔药。 
    2、打游戏时的存档。
    3、Windows 里的 ctri + z。 
    4、IE 中的后退。 
    4、数据库的事务管理。
优点: 
    1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。
    2、实现了信息的封装,使得用户不需要关心状态的保存细节。
缺点:
    消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
使用场景: 
    1、需要保存/恢复数据的相关状态场景。 
    2、提供一个可回滚的操作。
注意事项: 
    1、为了符合迪米特原则,还要增加一个管理备忘录的类。 
    2、为了节约内存,可使用原型模式+备忘录模式。

MementoPattern.h

#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:};

 

MementoPattern.cpp

#include "MementoPattern.h"

 

mainTest.cpp

#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/

你可能感兴趣的文章
PHP 7 的五大新特性
查看>>
深入了解php底层机制
查看>>
PHP中的stdClass 【转】
查看>>
XHProf-php轻量级的性能分析工具
查看>>
OpenCV gpu模块样例注释:video_reader.cpp
查看>>
【增强学习在无人驾驶中的应用】
查看>>
OpenCV meanshift目标跟踪总结
查看>>
就在昨天,全球 42 亿 IPv4 地址宣告耗尽!
查看>>
听说玩这些游戏能提升编程能力?
查看>>
如果你还不了解 RTC,那我强烈建议你看看这个!
查看>>
沙雕程序员在无聊的时候,都搞出了哪些好玩的小玩意...
查看>>
Mysql复制表以及复制数据库
查看>>
Kafka
查看>>
9.1 为我们的角色划分权限
查看>>
维吉尼亚之加解密及破解
查看>>
TCP/IP协议三次握手与四次握手流程解析
查看>>
PHP 扩展开发 : 编写一个hello world !
查看>>
inet_ntoa、 inet_aton、inet_addr
查看>>
用模板写单链表
查看>>
链表各类操作详解
查看>>