设计模式之备忘录模式
备忘录,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。该模式很好理解,其UML图如下:
在Originator中提供了创建Memento的接口,具体要保存什么样的内容,则根据需求来定。而Caretaker则是负责管理Memento。而保存的内容的具体的组织方式什么的都封装在Memento中了。这样做耦合性很低,方便维护和扩展。示例代码如下:
// MemoModel.h文件
#pragma once
#include <iostream>
#include <string>
class Memo;
class Originator
{
private:
std::string m_state;
public:
Memo * createMemo();
void show()
{
std::cout << m_state << std::endl;
}
void setState(std::string str)
{
m_state = str;
}
void recoverState(Memo * p);
};
class Memo
{
public:
std::string m_state;
Memo(std::string str)
{
m_state = str;
}
};
Memo * Originator::createMemo()
{
return new Memo(m_state);
}
void Originator::recoverState(Memo * p)
{
setState(p->m_state);
}
class Caretaker
{
private:
Memo * m_pMemo;
public:
Caretaker() : m_pMemo(nullptr) {}
~Caretaker()
{
if (nullptr != m_pMemo)
delete m_pMemo;
}
Memo * getMemo()
{
return m_pMemo;
}
void setMemo(Memo * p)
{
m_pMemo = p;
}
};
测试代码如下:
#include <iostream>
#include "MemoModel.h"
int main()
{
using namespace std;
// 备忘录模式
Originator * p = new Originator;
Caretaker * pCare = new Caretaker;
// 设置状态
p->setState("A");
p->show();
// 创建备忘录
pCare->setMemo(p->createMemo());
// 更改状态
p->setState("B");
p->show();
// 恢复状态
p->recoverState(pCare->getMemo());
p->show();
delete pCare;
delete p;
getchar();
return 0;
}
测试结果如下图:
备忘录模式把要保存的细节封装在了Memo类中,如果要修改保存细节的话,不会影响到客户端。备忘录模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时。