设计模式(18)-行为型模式-MEMENTO模式
来源:互联网 发布:工艺流程优化的案例 编辑:程序博客网 时间:2024/06/13 00:16
3.5 MEMENTO模式
3.6.1 功能
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
一个备忘录 (memento)是一个对象, 它存储另一个对象在某个瞬间的内部状态,而后者称为备忘录的原发器 ( originator)。只有原发器可以向备忘录中存取信息,备忘录对其他的对象 “不可见”。
3.6.2 结构
• M e m e n t o( 备忘录,如S o l v e r S t a t e )
— 备忘录存储原发器对象的内部状态。原发器根据需要决定备忘录存储原发器的哪些
内部状态。
— 防止原发器以外的其他对象访问备忘录。备忘录实际上有两个接口,管理者
( c a r e t a k e r )只能看到备忘录的窄接口—它只能将备忘录传递给其他对象。相反 , 原
发器能够看到一个宽接口, 允许它访问返回到先前状态所需的所有数据。理想的情况
是只允许生成本备忘录的那个原发器访问本备忘录的内部状态。
• O r i g i n a t o r( 原发器,如 C o n s t r a i n t S ol v e r )
— 原发器创建一个备忘录,用以记录当前时刻它的内部状态。
— 使用备忘录恢复内部状态.。
• C a r e t a k e r(负责人,如 undo mechanism)
— 负责保存好备忘录。
— 不能对备忘录的内容进行操作或检查。
3.6.3 协作
• 管理器向原发器请求一个备忘录, 保留一段时间后 , 将其送回给原发器 , 如下面的交互图所示。
3.6.4 C++代码示例
下面这段代码没有引入caretaker,不过也大致表达了memento的核心观点.
//Memento.h
#ifndef _MEMENTO_H_
#define _MEMENTO_H_
#include<string>
using namespace std;
class Memento;
classOriginator
{
public:
typedef string State;
Originator();
Originator(constState&sdt);
~Originator();
Memento* CreateMemento();
void SetMemento(Memento* men);
void RestoreToMemento(Memento* mt);
State GetState();
void SetState(const State&sdt);
void PrintState();
protected:
private:
State _sdt;
Memento* _mt;
};
classMemento
{
public:
protected:
private:
//这是最关键的地方,将Originator为friend类,可以访问内部信息,但是其他类不能访问
friend class Originator;
typedef string State;
Memento();
Memento(const State& sdt);
~Memento();
void SetState(const State&sdt);
State GetState();
private:
State _sdt;
};
#endif //~_MEMENTO_H_
//Memento.cpp
StateOriginator::GetState()
{
return _sdt;
}
void Originator::SetState(const State&sdt)
{
_sdt = sdt;
}
void Originator::PrintState()
{
cout << this->_sdt << "....."<< endl;
}
void Originator::SetMemento(Memento* men)
{
}
void
Originator::RestoreToMemento(Memento*mt)
{
this->_sdt = mt->GetState();
}
//classMemento
Memento::Memento()
{
}
Memento::Memento(constState&sdt)
{
_sdt = sdt;
}
StateMemento::GetState()
{
return _sdt;
}
void Memento::SetState(const State& sdt)
{
_sdt = sdt;
}
//main.cpp
#include"Memento.h"
#include<iostream>
using namespace std;
int main(int argc,char*argv[])
{
Originator* o = new Originator();
o->SetState("old"); //备忘前状态
o->PrintState();
Memento* m = o->CreateMemento(); //将状态备忘
o->SetState("new"); //修改状态
o->PrintState();
//It’s better if
o->RestoreToMemento(m); //恢复修改前状态
o->PrintState();
return 0;
}
- 设计模式(18)-行为型模式-MEMENTO模式
- [设计模式-行为型]备忘录模式(Memento)
- 设计模式(18)-行为型-备忘录模式(Memento)
- 行为设计模式---备忘录模式(Memento)
- 【设计模式】行为模式之备忘录Memento
- 设计模式笔记--行为型模式之六--Memento 备忘录
- 设计模式--备忘录模式Memento(行为型)
- 设计模式(行为型)之备忘录模式(Memento Pattern)
- JAVA设计模式(19) —<行为型>备忘录模式(Memento)
- 设计模式(4)-行为型-备忘录模式(Memento)
- 设计模式-行为型- 备忘录模式(Memento)
- [设计模式笔记]三. 行为型模式--20. Memento模式(备忘录)对象行为型模式(一)
- 行为型模式-备忘录memento
- 设计模式-行为设计模式:备忘录模式 Memento
- 行为型模式-----备忘录模式(Memento)
- 行为型模式-Memento ( 备忘录模式 )
- Memento 备忘录模式 ----对象行为型模式
- java 设计模式 行为模式 -Memento(备忘录模式)
- Linux系统root密码修改
- java多线程同步工具之CountDownlatch
- python连接MySQL connect函数的参数说明
- 2014-06-01工作周报-耿田义
- 七古·夏泳小梅沙
- 设计模式(18)-行为型模式-MEMENTO模式
- JSON for java入门总结
- Processing Bitmaps Off the UI Thread不在UI线程中处理Bitmaps(Android官方翻译文档2)
- Win32下c++调用java
- Python list(列表)排序的两种方法
- 【Java】基本数据类型长度
- 设计模式(19)-行为型模式-OBSERVER模式
- 8086汇编中断入门
- H3C SecPath F100-C 防火墙配置说明