图片引用于百度
简介:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,需要时可以将状态恢复
优点:给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态
缺点:如果保存的数据过多,会造成大量的内存消耗
例子背景:Ctrl+z Ctrl+y
备忘录模式代码:
- 抽像备忘录类:
#pragma once
#include <string>
#include <iostream>
#include <vector>
using namespace std;
class Memento
{
public:
string m_str;
public:
Memento(string str) : m_str(str) {}
};
- 具体备忘录:
#pragma once
#include "Memento.h"
class Originator
{
private:
string m_str;
public:
Originator(){}
public:
Memento Save()
{
Memento memento(m_str);
return memento;
}
void Load(const Memento& memento)
{
m_str = memento.m_str;
}
void PrintCurrentStr()
{
cout << m_str << endl;
}
};
- 管理类:
#pragma once
#include "Memento.h"
class Caretake
{
private:
vector<Memento> m_lstMemento;
int m_currentIndex = 0;
public:
Caretake() {}
void Save(const Memento& menento)
{
m_lstMemento.push_back(menento);
m_currentIndex = m_lstMemento.size() - 1;
}
Memento LoadCurrentStr()
{
if( m_lstMemento.empty() || static_cast<int>(m_currentIndex >= m_lstMemento.size()) ) return Memento("");
return m_lstMemento.at(m_currentIndex);
}
void CtrlAndZ()
{
m_currentIndex--;
}
void CtrlAndY()
{
m_currentIndex++;
}
};
- 引用:
#include "Caretake.h"
#include "Originator.h"
int main()
{
Caretake caretake;
Originator orig;
orig.Load(Memento("你"));
caretake.Save(orig.Save());
orig.Load(Memento("你好"));
caretake.Save(orig.Save());
orig.Load(Memento("你好世"));
caretake.Save(orig.Save());
orig.Load(Memento("你好世界"));
caretake.Save(orig.Save());
orig.Load(Memento("你好世界!"));
caretake.Save(orig.Save());
orig.PrintCurrentStr();
caretake.CtrlAndZ();
orig.Load(caretake.LoadCurrentStr());
orig.PrintCurrentStr();
caretake.CtrlAndY();
orig.Load(caretake.LoadCurrentStr());
orig.PrintCurrentStr();
getchar();
return 0;
}
总结:
备忘录模式(Memento):这是一个比较实用的模式,能完整的保存对象内部的状态,配合原型模式能够更加简易的实现撤销机制
作者:丶梦爱
博客:https://blog.csdn.net/u014732297(转载请说明出处)