备忘录模式及C++实现

一,理论学习:
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>


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值