备忘录模式

一,简介

备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式输入行为模式。

二,角色

Originator

负责创建一个备忘录 Memento,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态

Memento

负责存储Originator对象的内部状态,并可防止Originator以外的其它对象访问备忘录

Caretaker

负责保存好备忘录

三,举例

首先保存一个状态,然后适当的时再恢复这个状态

1,类图

2,代码

class Memento {//备忘录
private:
	string m_state;//状态 可以是多个

public:
	Memento(string s):m_state(s){}
	string GetState() { return m_state; }//获得状态
	void SetState(string s) { m_state = s; }//设置状态
};

class Caretaker {//管理者
private:
	Memento* m_memento;
public:
	Memento* GetMemento() { return m_memento; }
	void SetMemento(Memento* m) { m_memento = m; }
	~Caretaker() { delete m_memento; }
};

class Originator {//发起人
private:
	string m_state;//需要保存的属性 可以有多个
public:
	string GetState() { return m_state; }
	void SetState(string s) { m_state = s; }
	Memento* CreateMemento() { return new Memento(m_state); }//创建备忘录 保存信息
	void SetMemento(Memento* m) { m_state = m->GetState(); }//恢复备忘录
	void Show() { cout << "state" << m_state << endl; }
};

int main()
{
	//初始状态
	Originator *o = new Originator();
	o->SetState("On");
	o->Show();

	//创建备忘录 保存状态
	Caretaker* c = new Caretaker();
	c->SetMemento(o->CreateMemento());

	o->SetState("Off");
	o->Show();

	o->SetMemento(c->GetMemento());//调用备忘录 恢复状态
	o->Show();

	system("pause");
	return 0;
}

四,优缺点

优点: 1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。 2、实现了信息的封装,使得用户不需要关心状态的保存细节。

缺点:消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。

五,使用场景

使用场景: 1、需要保存/恢复数据的相关状态场景。 2、提供一个可回滚的操作。

如:打游戏时的存档。 Windows 里的 ctri + z。 IE 中的后退。 数据库的事务管理

注意事项:

1、为了符合迪米特原则,还要增加一个管理备忘录的类。

2、为了节约内存,可使用原型模式+备忘录模式。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

土拨鼠不是老鼠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值