[设计模式]行为模式-备忘录(C++描述)
second60 20180515
1. 备忘录定义
官方定义:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。也可以将对象恢复到原先保存的状态。
也称快照模式。
2. 备忘录结构图

分析:
1. Originator: 发起人记录当前时刻的内部状态,负责创建和恢复备忘录数据。
2. Menento: 备忘录,负责存储发起人对象内部状态
3. Caretaker: 管理角色,对备忘录进行管理,保存和提供备忘录
3. 代码
#include <iostream>
using namespace std;
// 备忘录定义
// 用来记录当时的状态
class Memento
{
public:
Memento(const string& state)
{
_state = state;
}
string getState()
{
return _state;
}
void setState(const string& state)
{
_state = state;
}
private:
string _state;
};
// 发起者,即要备忘录的对象
// 发起者可以创建备忘录和恢复备忘录
class Originator
{
public:
Originator(){ _state = ""; }
virtual ~Originator(){}
void setState(const string& state)
{
_state = state;
}
string getState(){ return _state; }
Memento *createMemento(){
return new Memento(_state);
}
void restoreMemento(Memento *memento)
{
_state = memento->getState();
}
private:
string _state;
};
// 备忘录管理者
// 这里只是管理一个备忘录
// 可以定义一个容器来,来管理一批备忘状态
class Caretaker
{
public:
Memento* getMemento()
{
return _memento;
}
void setMemento(Memento* memento)
{
_memento = memento;
}
private:
Memento *_memento;
};
int _tmain(int argc, _TCHAR* argv[])
{
// 发起人,并设置状态
Originator *originator = new Originator();
originator->setState("state_one");
std::cout << originator->getState().c_str() << endl;
// 发起人备忘自已当前状态
Memento* memento = originator->createMemento();
// 备忘录管理者
Caretaker *caretaker = new Caretaker();
// 把备忘备由管理者管理
caretaker->setMemento(memento);
// 发起者修改了自已状态
originator->setState("state_two");
cout << originator->getState().c_str() << endl;
// 发起者想反悔了,想恢复到某一状态
// 备忘录可以有很多不同状态的备忘录
// 备忘后都可以恢复到之前备忘状态
originator->restoreMemento(caretaker->getMemento());
cout << originator->getState().c_str() << endl;
getchar();
return 0;
}
4. 备忘录优缺点
4.1优点:
1. 当发起人角色状态改变时,可能状态错误,能把错误的状态还原回来
2. 备份的状态无须发起人管理,交由管理者管理,逻辑解耦
4.2缺点:
1. 实际运用中,备忘录都是多状态的,多备份的,发起人角色状态需要存储到备忘录对象中,需消耗大量资源。
5. 备忘录用途
1. 需保存快照
2. 支持回滚的功能
3. 把快照信息和本身分开,不改变原有封装。
4. 游戏进度存盘
5. 需要保存恢复数据的相关状态场景
6. 总结
备忘录,在某些保存恢复数据的场景,非常有用,但要一定的内存开销。能在不改变封闭的条件下,新增备忘逻辑。用途没那么广泛,但模式简单,熟悉并运用到可运用场景。
本文详细介绍了备忘录设计模式的概念、结构与实现方法,并通过C++代码示例展示了如何在不破坏封闭的前提下,捕获对象的内部状态,并在对象之外保存这些状态,以便能够恢复到原先的状态。
911

被折叠的 条评论
为什么被折叠?



