[设计模式]行为模式-备忘录(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. 总结
备忘录,在某些保存恢复数据的场景,非常有用,但要一定的内存开销。能在不改变封闭的条件下,新增备忘逻辑。用途没那么广泛,但模式简单,熟悉并运用到可运用场景。