Memento - 备忘录模式
2024-08-28 04:15:39
定义
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
案例
比方如今有一个画图系统,我们在Viewer里面画了一些图形,可是在绘制的过程中可能画出的图像不是想要的,这时候须要到正确的绘制状态,这时候能够在每次绘制的时候保存绘制的状态信息。可是要在不改变Viewer的封装性的前提下实现。有点困难,这时候就能够使用备忘录模式。
一个备忘录Memento是一个对象,它存储还有一个对象在某个瞬间的内部状态,后者称为备忘录的原发器(originator):
Memento类是用来保存Viewer的相关状态:
class Memento
{
public:
void setState(State* state) { m_state = state; }
State* state() const { return m_state; }
private:
friend class Viewer;
Memento() { }
private:
State* m_state;
};
Viewer是Memento的友元类,能够在须要的时刻创建Memento对象,来保存自身的状态信息:
class Viewer
{
public:
void drawGraphics();
Memento* createMemento();
void setMemento(Memento* memento);
};
Memento* Viewer::createMemento()
{
State* state = getSelfState();
Memento* memento = new Memento();
memento->setState(state);
return memento;
}
void setMemento(Memento* memento)
{
setSelfState(memento->state());
}
Command类是用来绘制图形。并能够回滚操作:
class Command
{
public:
void execute();
void unExecute();
private:
Viewer* m_viewer;
std::vector<Memento*> m_mementos;
};
void Command::execute()
{
m_viewer->drawGraphics();
m_mementos.push_back(m_viewer->createMemento());
}
void Command::unExecute()
{
if(!m_memento.isEmpty())
{
m_viewer->setMemento(m_mementos.back());
m_mementso.pop_back();
}
}
效果
- 保持封装,避免了暴露由自身管理但必须存储在自身之外的数据
- 简化了原发器Viewer,把管理存储状态信息的重任交给了Memento
- 使用代价高,可能因为频繁的操作创建了大量的Memento,能够通过顺序存储,下一次仅仅存储上一次保存后改变的信息
最新文章
- java.lang.NoClassDefFoundError: Lorg/slf4j/Logger;
- lucene-查询query->;BooleanQuery “与或”搜索
- MVC Autofac 注入点
- Lombok(1.14.8) - @Log
- Keepass TAN 记录的使用
- ORACLE EBS R12 FOR LINUX 开机后如何启动数据库、应用脚本[Z]
- 剖析Jetty实现原理
- IIS 之 在IIS7、IIS7.5中应用程序池最优配置方案
- 镜像的缓存特性 - 每天5分钟玩转 Docker 容器技术(14)
- JQuery纵向下拉菜单实现心得
- MonolithFirst
- c#中string的一些基本用法
- NorFlash 学习
- Mac下多版本JDK安装
- [hadoop] hadoop native libraries 编译
- mint-ui是什么?怎么使用?说出至少三个组件使用方法?
- Java界面编程—事件的种类
- CVE-2013-2551
- uboot的配置及编译
- 模型的偏差bias以及方差variance
热门文章
- Beta冲刺提交-星期三
- 共享win7ip,虚拟机nat模式连接,电脑重启之后,无法连接
- CAD参数绘mcdbsolid对象(网页版)
- java线程池,信号量使用demo
- 01XML文档结构
- Oracle排名函数(Rank)实例详解
- BZOJ2007 NOI2010 海拔 平面图转对偶图 最小割
- [bzoj2806][Ctsc2012]Cheat(后缀自动机(SAM)+二分答案+单调队列优化dp)
- mysql性能优化工具mysqltuner使用
- python3.x Day6 socketserver