备忘录模式:
Without violating encapsulation, capture and externalize an object's internal state so that the object can be restored to this state later.(在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
C++实现:
#ifndef __MEMENTO_H__ #define __MEMENTO_H__ #include <iostream> #include <string> using namespace std; class Originator; class Memento { public: typedef string State; friend class Originator; Memento(State& state) : _state(state) { } State GetState() { return _state; } void SetState(const State& state) { _state = state; } private: State _state; }; class Originator { public: typedef string State; Originator(State& state) : _state(state) { } State GetState() { return _state; } void SetState(const State& state) { _state = state; } Memento* CreateMemento() { return new Memento(this->_state); } void RestoreMemento(Memento* meme) { cout << "还原状态:"; this->_state = meme->GetState(); } void ShowState() { cout <<"ShowState() --> " << _state << endl; } private: State _state; Memento* _pMemento; }; class CareTaker { public: CareTaker(Memento* pMemento):_pMemento(pMemento) { } Memento* GetMemeto() { return _pMemento; } void SetMemeto(Memento* pMemento) { _pMemento = pMemento; } private: Memento* _pMemento; }; #endif //__MEMENTO_H__ #include "Memento.h" int main() { Originator* pOriginator = new Originator(string("old")); pOriginator->ShowState(); Memento* pMem = pOriginator->CreateMemento(); CareTaker* pTaker = new CareTaker(pMem); pOriginator->SetState("new"); pOriginator->ShowState(); pOriginator->RestoreMemento(pTaker->GetMemeto()); pOriginator->ShowState(); delete pTaker; delete pMem; delete pOriginator; return 0; }
当前模式有Originator,Memento,Caretaker三种角色,可以精简利用原型模式Clone把3个角色全并到Originator上去。即Clone方式的备忘录(仅应用在小规模或场景单一的情况下,若要与其他对象产生严重耦合关系考虑换用多状态备忘录模式,关联一张Hashmap)
多备份的备忘录模式,即备份的备份。关联2张Hashmap
更强的封装性,声明一个空接口IMemento,类中类Memeto实现其接口,并在Originator类中private声明。那么对于备忘也只能由发起人Originator独自享用了。外部可以通过关联访问IMemento的接口。