一,理论学习:
1.什么是备忘录模式?
GoF《设计模式》中对备忘录模式的定义是这样的:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存的状态!
世界上本没有后悔药,但是我们在进行软件系统设计的时候要给用户后悔的权利,提供用户后悔药!备忘录模式顾名思义就是将一个对象某个时候的状态备个份,当用户后面需要返回这个状态时就可以把备份调出来用!
2.备忘录模式涉及的角色:
2.1 originator(发起人):负责创建一个备忘录memento,用以记录当前时刻自身的内部状态,并可以使用备忘录恢复内部状态。originator可以根据需要决定memento储存自己的哪些内部状态。
2.2 memento(备忘录):负责存储originator对象的内部状态,并可以防止originator以外的其他对象访问备忘录。
2.3 caretaker(管理者):负责管理备忘录memento,但不能memento的内容进行访问或者操作(原因如上面2.2)。
3.代码实现说明:
实现备忘录模式的关键就是friend class Word_Input,memento的接口都声明为private(构造函数除外),而将 Word_Input声明为memento的友元类,为的就是防止 Word_Input以外的其他对象访问memento!也就达到了封密的效果!也即定义中所说的不破坏封闭!
4.备忘录模式的使用场合:
当你需要让对象返回之前的状态时,就使用备忘录模式!
二,备忘录模式C++代码实现:
#include<iostream>
#include<string>
using namespace std;
class Word_Input;
class Memento
{
public:
Memento(string m_word) :word(m_word){}
private:
friend class Word_Input;
string GetWords()
{
return word;
}
string word;
};
class Word_Input
{
public:
Word_Input(string myword) :word(myword){}
//存档
Memento*SaveWords()
{
return new Memento(word);
}
//恢复存档
void RecycleWords(Memento*pword)
{
word = pword->GetWords();
cout << "Good! 坚持最初的想法!你最初的想法是这样滴:" << endl;
}
//输出文字
void ShowWords()
{
cout << word << endl << endl;
}
private:
string word;
};
class Caretake
{
public:
void SetMemento(Memento*m_pmemento)
{
Pmemento = m_pmemento;
}
Memento* GetMemento()
{
return Pmemento;
}
private:
Memento*Pmemento;
};
int main(void)
{
Word_Input*wi_1 = new Word_Input("我对自己说我要努力学习设计模式!");
wi_1->ShowWords();//显示初始状态
//存档
Caretake*ct = new Caretake;
ct->SetMemento(wi_1->SaveWords());
//建立新的状态
Word_Input*wi_2 = new Word_Input("后来随着学习的深入,我的想法发生了改变,设计模式太抽象太难了!");
wi_2->ShowWords();//显示新的状态
Word_Input*wi_3 = new Word_Input("但是.....我不想以后做只会搬砖的码农,所以我要坚持最初的想法!");
wi_3->ShowWords();//显示新的状态
int choise;
cout << "请输入你的选择:1.放弃 2.坚持最初的想法" << endl;
cout << "你的选择是:";
cin >> choise;
switch (choise)
{
case 1:
cout << "你就这点出息!" << endl;
break;
case 2:
wi_1->RecycleWords(ct->GetMemento());//读取存档,坚持最初的想法
wi_1->ShowWords();
break;
default:cout << "你输入的选项有误!" << endl;
}
delete wi_1;
delete wi_2;
delete wi_3;
delete ct;
system("pause");
return 0;
}
<strong>运行结果截图:</strong>