介紹
備忘錄模式將一物件的內部狀態備份起來,供後續恢復狀態時使用。
C++範例
#include <iostream>
#include <string>
class Memento;
class Object
{
public:
Object(int value) : m_value(value)
{
}
void IncrementInternalValue()
{
m_value++;
}
void PrintInternalValue() const
{
std::cout << "value in object: " + std::to_string(m_value) << std::endl;
}
Memento *CreateMemento() const;
void ReinstateMemento(Memento *mem);
private:
int m_value;
};
// 紀錄物件的類
class Memento
{
public:
// 將給予的物件備份
Memento(const Object &obj) : m_obj(obj) {}
// 返回備份物件
Object Snapshot() const
{
return m_obj;
}
private:
Object m_obj;
};
Memento *Object::CreateMemento() const
{
return new Memento(*this);
}
void Object::ReinstateMemento(Memento *mem)
{
*this = mem->Snapshot();
}
int main()
{
// 建立一個內部狀態為1的物件
Object object(1);
// 印出內部狀態 (原始值)
object.PrintInternalValue();
// 紀錄object內部狀態到Memento
Memento mem(object);
// 改變object的內部狀態
object.IncrementInternalValue();
// 印出內部狀態 (改變後)
object.PrintInternalValue();
// 將object恢復到先前紀錄的狀態
object = mem.Snapshot();
// 印出內部狀態 (恢復後)
object.PrintInternalValue();
return 0;
}
Output:
value in object: 1
value in object: 2
value in object: 1