设计模式笔记-Memento模式

原创 2016年06月01日 17:18:57

备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。备忘的用例很多,比如word编辑,按ctrl+z撤消,如果没备忘,肯定是不能撤消回到之前状态的;打过游戏的人应该也了解,比如DOTA1,技术挺落后,不像DOTA2断线可以重连,比赛的时候为了防止游戏崩溃,时不时的裁判要手动保存游戏。


这里的Memento类保存的是Originator类的一个临时状态,它自己是不可以变化的--本来就是要保存原来状态,又被改变了那不是没意义了?所以这里我把Memento类的所有成员都设为private的,然后把Originator设为友元类,这样它就只能被Originator访问了。这个应该是个关注点,但看网上好多人没有这么弄,成员函数都是public的,可能很多人觉得只要我不去调用它不就行了嘛,违反了迪米特法则?“一个对象应该对其他对象保持最少的了解”,这就是设计的精妙。

还有一点就是:为了在Originator类中创建备忘,设计了备忘类Memento的一个带Originator*类型参数的拷贝构造函数!

//originator.h

#include<string>
#include "memento.h"

class Memento;
class Originator {
public:
	Memento* createMemento();

	void restoreMemento(Memento *);

	void setState(string state)	{
		_state = state;
	}
	string getState() {
		return _state;
	}
private:
	std::string _state;
};
//originator.cpp

void Originator::restoreMemento(Memento *m) {
	_state = m->getState();
}
Memento* Originator::createMemento() {
	return new Memento(this);
}
//memento.h
#include"originator.h"
#include<string>

class Originator;
class Memento {
	friend class Originator;
private:
	Memento(Originator*);

	void setState(std::string state) {
		_state = state;
	}
	std::string getState() {
		return _state;
	}

private:
	std::string _state;
};
//memento.cpp
#include "memento.h"
Memento::Memento(Originator *o) {
	_state = o->getState();
}
完全可以不用Caretaker类,此时用户代码需要自己处理备份多状态逻辑(用容器)。 简单的实现如下:

class Caretaker {
	void Save(Memento *lpMemento) {
		m_vectMemento.push_back(lpMemento);
	}

	Memento* Load(int idx) {	//这里随便你怎么实现吧
		return m_vectMemento[idx];
	}

private:
	vector<Memento*> m_vectMemento;
};
用户代码:

int main()
{
	Originator originator;
	originator.setState("old");
	Memento * meme = originator.createMemento();
	originator.setState("new");
	originator.restoreMemento(meme);

	//使用Caretaker类也可以
	Originator originator;
	Caretaker take;
	originator.setState("old");
	Memento * meme = originator.createMemento();
	take.Save(meme);
	originator.setState("new");
	originator.restoreMemento(take.Load(0));
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

设计模式笔记——Memento

备忘录模式Memento 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样可以将该对象恢复到原先保存的状态。Memento模式可以把复杂的对象内部信息对其他的对象屏蔽...

设计模式笔记(10 MEDIATOR & MEMENTO)

设计模式笔记(10 MEDIATOR & MEMENTO) MEDIATOR(中介者) 适用性: 1.一组对象以定义良好但是复杂的方式进行通信,产生相互依赖关系混乱且难以理解。 2...
  • ilvu999
  • ilvu999
  • 2012年10月18日 10:13
  • 348

设计模式(c++)笔记之十七(Memento模式)

一、描述:       没有人想犯错误,但是没有人能够不犯错误。犯了错误一般只能改过,却很难改正(恢复)。世界上没有后悔药,但是我们在进行软件系统的设计时候是要给用户后悔的权利(实际上可能...

设计模式学习笔记---备忘录模式memento pattern(Java版)

一、场景 录入大批人员资料,当正在录入当前人资料时,发现上一个人录错了 此时需要恢复上一个人的资料,再进行修改。 Word文档编辑时,忽然电脑死机或断电,再打开时可以看到word 提示你恢复到...

设计模式 笔记 备忘录模式 Memento

//---------------------------15/04/27---------------------------- //Memento 备忘录模式----对象行为型模...
  • boydfd
  • boydfd
  • 2015年04月27日 16:37
  • 752

设计模式笔记22:备忘录模式(Memento Pattern)

一、备忘录模式的内容 备忘录模式(Memento Pattern):在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。它是一种对象行...

设计模式学习笔记——备忘录(Memento)模式

设计模式学习笔记——备忘录(Memento)模式@(设计模式)[设计模式, 备忘录模式, memento]设计模式学习笔记备忘录Memento模式 基本介绍 备忘录案例 类图 实现代码 Memento...

设计模式读书笔记之备忘录模式(Memento)

备忘录模式:在不破坏封装性的前提下,捕获对象的内部状态并保存,这样以后就可以恢复该对象恢复到保存的状态。 备忘录模式比较简单, 不要因为名字比较陌生而不敢学它. 它没有复杂的结构, 上图...

[设计模式笔记]三. 行为型模式--20. Memento模式(备忘录)对象行为型模式(一)

行为型模式--Memento模式(备忘录)对象行为型模式 一. 意图         在不破坏封装性的前提下, 捕获一个对象的内部状态, 并在该对象之外保存这个状态. 这样以后就可...
  • cay22
  • cay22
  • 2013年10月18日 10:14
  • 1026
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式笔记-Memento模式
举报原因:
原因补充:

(最多只允许输入30个字)