简介
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
数据库连接的事务管理就是备忘录模式。
应用场景
需要提供保存和恢复数据的相关状态场景。
提供一个可回滚rollback操作。
代码如下:
#include <iostream>
#include <string>
#include <memory>
#include <map>
#include <list>
//备忘录类
class memento
{
public:
memento(std::string state) : m_state(state)
{
}
const std::string &get_state(void)
{
return m_state;
}
void set_state(std::string state)
{
m_state = state;
}
private:
std::string m_state;
};
//管理者类
class caretaker
{
public:
void set_memento(const std::shared_ptr<memento> &mmt)
{
m_memento = mmt;
}
const std::shared_ptr<memento> get_memento(void)
{
return m_memento;
}
private:
std::shared_ptr<memento> m_memento;
};
class originator
{
public:
const std::string &get_state(void)
{
return m_state;
}
void set_state(std::string state)
{
m_state = state;
}
std::shared_ptr<memento> create_memento(void)
{
return std::make_shared<memento>(m_state);
}
void set_memento(const std::shared_ptr<memento> &mmt)
{
set_state(mmt->get_state());
}
void show(void)
{
std::cout << "my state is : " << m_state << std::endl;
}
private:
std::string m_state;
};
int main()
{
std::cout << "start-up .." << std::endl;
std::shared_ptr<originator> ogt = std::make_shared<originator>();
ogt->set_state("周一,一晚10次!");
ogt->show();
std::shared_ptr<caretaker> ctk = std::make_shared<caretaker>();
ctk->set_memento(ogt->create_memento());
ogt->set_state("周二,一晚2次!");
ogt->show();
ogt->set_memento(ctk->get_memento());
ogt->show();
std::cout << "done .." << std::endl;
return 0;
}
运行如下: