memento模式
参考资料
• 维基百科:https://en.wikipedia.org/wiki/Memento_pattern
Memento模式简介
GoF:Without violating encapsulation, capture and externalize an object's internal state so that the object can be restored to this state later.
GoF:在不破坏封闭的前提下,捕获并外部化一个对象的内部状态,这样之后就可以将该对象恢复到保存时的状态。
Wikipedia:The memento pattern is a software design pattern that provides the ability to restore an object to its previous state (undo via rollback). The memento pattern is implemented with three objects: the originator, a caretaker and a memento. The originator is some object that has an internal state. The caretaker is going to do something to the originator, but wants to be able to undo the change. The caretaker first asks the originator for a memento object. Then it does whatever operation (or sequence of operations) it was going to do. To roll back to the state before the operations, it returns the memento object to the originator. The memento object itself is an opaque object (one which the caretaker cannot, or should not, change). When using this pattern, care should be taken if the originator may change other objects or resources - the memento pattern operates on a single object.
Wikipedia:备忘录模式是一种软件设计模式,它提供一种能将一个对象恢复到旧状态的能力(回滚式的撤销操作)。备忘录模式通过三个对象来实现:originator、caretaker和memento。originator是一些拥有内部状态的对象。caretaker将在originator之上进行一些处理,但是同时希望能够撤销之前的处理操作。caretaker首先向originator请求一个memento对象,然后它将进行它所要进行的任何操作。为了回滚回进行这些操作的状态,caretaker将返回memento对象给originator。memento对象是一种不透明对象(caretaker不能也不应该对其改变)。使用这种模式的时候,需要注意的是originator可能改变其他对象或资源的状态,备忘录模式只对单一对象起作用。
百度百科:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
Memento模式详解
• 设计意图
在不破坏封闭的前提下,捕获并外部化一个对象的内部状态,这样之后就可以将该对象恢复到保存时的状态。
• 结构图

• 结构说明
▶ Memento
备忘录,用于存储originator对象的内部状态。memento对象应该根据originator的实际需要,存储必要的originator对象的内部状态。它能够保护对状态的访问。memento实际上拥有两个接口。caretaker对象只能访问memento对象的窄接口,即它只能够把memento对象传递给其他对象。相反,originator对象可以访问memento的宽接口,即获取所有能恢复到旧状态的必要数据。理想情况下,只有创建memento的oiginator对象才有权限访问memento对象的内部状态信息.
▶ Originator
发起人。创建一个memento对象来存储它当前内部状态的一个快照,这些内部信息将保存在memento对象之中。
▶ Caretaker
管理者,负责memento对象的安全存储,但从不对memento对象的内容进行操作或检查。
• 时序图
caretaker对象向originator对象请求并持有一个memento,然后将memento对象传递回给originator,如下图所以。有时caretaker对象并不会将memento对象传递回给originator,这是因为originator可能不需要回滚回旧状态。memento对象总是消极的,只有创建memento对象的originator对象才会分配或回复其状态。

Memento模式举例
• 例子一
这个例子出自于Wikipedia:https://en.wikipedia.org/wiki/Memento_pattern
#include <vector>
#include <string>
#include <iostream>
using namespace std; // Memento: It holds the internal state of Originator
class Memento
{
private:
string m_State; public:
Memento(const string &state = "") : m_State(state) {} public:
const string &GetState() const
{
return m_State;
} void SetState(const string& state)
{
m_State = state;
}
}; // Originator: It is the one whose state needs to be saved and creates a Memento object.
class Originator
{
private:
string m_State;
// The class could also contain additional data that is not part of the state saved in the memento.
public:
void ChangeState(const string &state)
{
cout << "Originator: Changing state to " << state << endl;
m_State = state;
} Memento SaveToMemento()
{
cout << "Originator: Saving to Memento." << endl;
return Memento(m_State);
} void RestoreFromMemento(const Memento &memento)
{
m_State = memento.GetState();
cout << "Originator: State after restoring from Memento is " << m_State << endl;
}
}; int main()
{
// Acts as Caretaker here
vector<Memento> mementos;
Originator originator; originator.ChangeState("State 1");
originator.ChangeState("State 2"); // Save "State 2" to memento
mementos.push_back(originator.SaveToMemento()); originator.ChangeState("State 3"); // Save "State 3" to memento
mementos.push_back(originator.SaveToMemento()); originator.ChangeState("State 4"); // Restore "State 3" to originator
originator.RestoreFromMemento(mementos[]); return ;
}
memento模式的更多相关文章
- Memento 模式
Memento 模式的关键就是要在不破坏封装行的前提下,捕获并保存一个类的内部状态,这样就可以利用该保存的状态实施恢复操作. /////////Originator.h//////////////// ...
- 【行为型】Memento模式
备忘录模式顾名思义就是一种能有备忘作用的设计模式,其目的是在对象外部保存其在某一时刻的状态信息,并且在任何需要的时候,都可以通过备忘录中保存的状态数据恢复对象在当时情形下的状态. 备忘录模式旨在对象的 ...
- Java设计模式(15)备忘录模式(Memento模式)
Memento定义:memento是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到原先保存的状态. Memento模式相对也比较好理解,我们看下列代码: public class ...
- 设计模式之——Memento模式
Memento模式即快照模式,就是在某一时刻,设定一个状态,在后面随时可以返回到当前状态的模式. 我们拿一个闯关游戏作为举例,一共有十关,每闯一关,玩家所持金额增加一百,而闯关失败就扣一百.初始时,给 ...
- Memento模式(备忘录设计模式)
Memento模式? 使用面向对象编程的方式实现撤销功能时,需要事先保存实例的相关状态信息.然后,在撤销时,还需要根据所保存的信息将实例恢复至原来的状态.这个时候你需要使用Memento设计模式.(以 ...
- C++设计模式实现--备忘录(Memento)模式
一. 备忘录模式 定义:在不破坏封装性的前提下,捕获一个对象的内部状态.并在该对象之外保存这个状态. 这样以后就可将该对象恢复到原先保存的状态. 结构图: 使用范围: Memento 模式比較适用于功 ...
- Behavioral模式之Memento模式
1.意图 在不破坏封装性的前提下,捕获一个对象的内部状态.并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态. 2.别名 Token 3.动机 有时候有必要记录一个对象的内部状态.为 ...
- 设计模式(十八)Memento模式
在使用面向对象编程的方式实现撤销功能时,需要事先保存实例的相关状态信息.然后,在撤销时,还需要根据所保存的信息将实例恢复至原来的状态. 要想恢复实例,需要一个可以自由访问实例内部结构的权限.但是,如果 ...
- 设计模式C++描述----17.备忘录(Memento)模式
一. 备忘录模式 定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 结构图: 使用范围: Memento 模式比较适用于功能 ...
随机推荐
- Could not contact Selenium Server; have you started it on 'localhost:4444'
今天学习selenium RC例子的时候遇到一个问题:java.lang.RuntimeException: Could not contact Selenium Server; have you s ...
- UP与瀑布模型
软件开发过程(Software development process)描述了构造.部署以及维护软件的方式.(就是先做什么后做什么)统一过程(The Unified Software Developm ...
- QWidget切换
QWidget切换,参考类:QstackedLayout,QStackedWidget,QTabWidget 一.Tab出现的位置 tabWidget.setTabPosition(QTabWidge ...
- java 问题
1. 在ezmorph包中 有个 引用类时 写法为import [Z; 为什么加个[看不懂
- jquery用ajax方式从后台获取json数据后如何将内容填充到下拉列表
对于问题从后台获取json数据,将内容填充到下拉列表,代码非常简单,具体过程请看下面代码. 需求:url:链接 par:ID sel:下拉列表选择器 function BuildS ...
- php 快速读取文件夹下文件列表
在读取某个文件夹下的内容的时候 以前是使用 opendir readdir结合while循环过滤 . ..当前文件夹和父文件夹来操作的. 代码如下: 然后偶然发现了有scandir函数 可以扫描文件夹 ...
- Hadoop1.2.1 出现Warning: $HADOOP_HOME is deprecated.的解决方案
通过启动或停止hadoop我们会发现会出现 “Warning: $HADOOP_HOME is deprecated” 这样一个警告,下面给出解决方案: 不过我们一般推荐第二种,因为我们还是需要$HA ...
- 'not all arguments converted during string formatting'错误告警信息解决办法
问题描述:
- windows mysql初始化
参考文章 https://dev.mysql.com/doc/refman/5.7/en/windows-install-archive.html mysqld --initialize --user ...
- poj_1125 Floyd最短路
题目大意 N个股票经纪人,每个股票经纪人都会将得到的消息传播给另外一些股票经纪人,传播的速度均不固定,且从A传到B的速度和B传到A的速度不一定相等.给定一个消息,并不一定能够传遍所有的股票经纪人,因为 ...