博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【设计模式】备忘录
阅读量:6078 次
发布时间:2019-06-20

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

备忘录,其实名字也比较形象。

我们经常遇到将一个类的状态恢复到历史版本的需求。比如一个记事本,想保存一个上N个状态,通过Ctrl+Z可以恢复此前编辑内容。备忘录就非常适合这种场景。此时发起者类,希望能够将自身状态保留在某处,而且不希望过多的暴露细节。为了上述目的,发起者会在某个时刻通过new出一个备忘类对象,并将该对象托管给管理者类。然后需要恢复状态时,又从管理者类中获取具体状态,将自身恢复到某个状态。

为了保持封装性,备忘录一般除了将自己暴露给发起者外(或者可以认为是发起者将自己状态暴露给了备忘类),不为外部类提供任何访问状态相关接口。C++中这个通常是通过将自己所有接口都改成private(包括构造函数),然后将发起者设为自己的友元类来实现。

写了个demo,可以支持多个版本:

 

/*************************************************************************** *  * Copyright (c) 2013 itegel.com, Inc. All Rights Reserved *  **************************************************************************/   /** * @file test_memento.cpp * @author itegel * @date 2013/06/08 11:29:08 * @brief  *   **/#include 
#include
#include
using namespace std;class State{ public: int version; string content;};class Memento{ public: private: friend class NoteBook; Memento(State state) : _state(state){} ~Memento(){} State * GetState(){ return &_state; } void SetState(State state){ _state = state; } State _state;};//originatorclass NoteBook{ public: NoteBook(int version, string content){ _state.version = version; _state.content = content; } NoteBook(State & state):_state(state){ } void SetMemento(Memento * mem){ _state = mem->_state; } Memento * GetMemento(){ return new Memento(_state); } void SetState(int version, string content){ _state.version = version; _state.content = content; } int GetVersion(){ return _state.version; } void PrintState(){ cout<<"Note:\n\tversion:\t"<<_state.version<
<<"\tcontent:\t"<<_state.content<
_memento_map;};int main(){ NoteBook my_note(0, ""); CareTaker care_taker; my_note.PrintState(); cout<<"Save State 0!"<

执行结果:

 

 

Note:	version:	0	content:	Save State 0!Edit for 1st time!Note:	version:	1	content:	Hello world!Edit for 2nd time!Note:	version:	2	content:	Hello World! It is the 2nd version!Edit for 3rd time!Note:	version:	3	content:	Hello Itegel! It is the 3rd version!Restore 2nd version:Note:	version:	2	content:	Hello World! It is the 2nd version!Restore 0 version:Note:	version:	0	content:

 

备忘录模式使用场景应该比较固定,但是其实现可以很灵活。主要思想就是将自己的状态托管给一个其他类,但是又不想过多的暴露自身信息,从而引入了备忘录类。变化的地方应该是状态成员的变化吧。此时只需要修改State类就好,其他其实可以做到不用修改(除了发起者关于这个新增状态信息的维护)。

P.S. 到这儿23个设计模式中行为模式都写过一些demo了。好久没抽空写东西了,发现其实写代码都有些生疏了。

这些天一直抽空写一些demo,理解还不够深,但是代码都是自己一行一行敲进去的。这样体会会深一些吧。其实很多时候,还是需要跟实际项目结合,理解会更深一些。个人体会是,程序员多写代码才是王道。

 

转载地址:http://tqqgx.baihongyu.com/

你可能感兴趣的文章
从MFQ方法到需求分析
查看>>
android.view.WindowManager$BadTokenException: Unable to add window
查看>>
HDU5012:Dice(bfs模板)
查看>>
iphone openssh
查看>>
Linux下MEncoder的编译
查看>>
Javascript中闭包(Closure)的探索(一)-基本概念
查看>>
spark高级排序彻底解秘
查看>>
ylbtech-LanguageSamples-PartialTypes(部分类型)
查看>>
福建省促进大数据发展:变分散式管理为统筹集中式管理
查看>>
开发环境、生产环境、测试环境的基本理解和区别
查看>>
tomcat多应用之间如何共享jar
查看>>
Flex前后台交互,service层调用后台服务的简单封装
查看>>
MySQL入门12-数据类型
查看>>
Windows Azure 保留已存在的虚拟网络外网IP(云服务)
查看>>
修改字符集
查看>>
HackTheGame 攻略 - 第四关
查看>>
js删除数组元素
查看>>
带空格文件名的处理(find xargs grep ..etc)
查看>>
华为Access、Hybrid和Trunk的区别和设置
查看>>
centos使用docker下安装mysql并配置、nginx
查看>>