设计模式 _备忘录模式

标签: 设计模式 备忘录模式 c++ 完整可运行代码 新手
176人阅读 评论(0) 收藏 举报
分类:

备忘录模式

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

使用情景:很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作,能够恢复到他原先的状态,使得他有"后悔药"可吃。

解决方法:通过一个备忘录类专门存储对象状态。

UML图:


备忘录模式包含以下几个角色:  

Originator: 原发器。负责创建一个备忘录,用以记录当前对象的内部状态,通过也可以使用它来利用备忘录恢复内部状态。同时原发器还可以根据需要决定Memento存储Originator的那些内部状态。
Memento: 备忘录。用于存储Originator的内部状态,并且可以防止Originator以外的对象访问Memento。在备忘录Memento中有两个接口,其中Caretaker只能看到备忘录中的窄接口,它只能将备忘录传递给其他对象。Originator可以看到宽接口,允许它访问返回到先前状态的所有数据。
Caretaker: 负责人。负责保存好备忘录,不能对备忘录的内容进行操作和访问,只能够将备忘录传递给其他对象。

实例:

先创建一个origin角色,属性分别是dijiang、1,然后创建备忘录备份,然后将origin的属性重新设为liyf、2,最后通过备忘录将origin的状态恢复最原始状态,达到“反悔”的效果。

完整可运行代码:

#include<iostream>
#include<memory>
#include<string>
using namespace std;

//备忘录类,保存状态
class Memento
{
public:
	Memento(string state, int value) { maState = state; maValue = value; }
	const string& getState() { return maState; }
	const int getValue() { return maValue; }
private:
	string maState;
	int maValue;
};

//保存备忘录的类
class Caretaker
{
public:
	void setMemento(shared_ptr<Memento> memento) { maMemento = memento; }
	shared_ptr<Memento> getMemento(){ return maMemento; }
private:
	shared_ptr<Memento> maMemento;
};

//要备份的类
class Origin
{
public:
	void disPlay() { cout << maState << ": " << maValue << endl; }
	void setState(string state) { maState = state; }
	void setValue(int value) { maValue = value; }

	//根据备忘录类恢复状态
	void recovery(shared_ptr<Memento> mem)
	{
		this->maState = mem->getState();
		this->maValue = mem->getValue();
	}

	//创建备忘录,保存状态
	shared_ptr<Memento> createMemento()
	{
		return make_shared<Memento>(maState, maValue);
	}

private:
	string maState;
	int maValue;
};

int main()
{
	Origin origin;
	origin.setState("dijiang");
	origin.setValue(1);
	origin.disPlay();
	cout << "-----back up ing-----" << endl;
	Caretaker caretaker;
	caretaker.setMemento(origin.createMemento());
	origin.setState("liyf");
	origin.setValue(2);
	origin.disPlay();
	cout << "set to origin value" << endl;
	origin.recovery(caretaker.getMemento());
	origin.disPlay();
	return 0;
}

运行截图:



查看评论

JAVA设计模式之:备忘录模式

备忘录模式:又叫做快照模式,指在不破坏封装性的前提下,获取到一个对象的内部状态,并在对象之外记录或保存这个状态。在有需要的时候可将该对象恢复到原先保存的状态。我们相当于把对象原始状备份保留,所以叫备忘...
  • true100
  • true100
  • 2016-01-22 12:26:39
  • 2963

设计模式学习笔记--备忘录模式

一.简介 今天来学习一下设计模式中的备忘录模式。说到这个模式,也许不太熟悉,不过相信写代码的时候,写错了之后,Ctrl+Z的功能用得还是比较多的,比如Word,Photoshop等编辑软件中,撤销...
  • puppet_master
  • puppet_master
  • 2016-05-06 14:46:32
  • 900

23种设计模式之---备忘录模式

前言网上搜索备忘录设计模式,基本上均是在一个GoF,基础上衍生下来的。为了避免重复造轮子,这里会结合网上demo,和自己理解进行总结定义:备忘录(Memento)模式又称标记(Token)模式。GOF...
  • o279642707
  • o279642707
  • 2017-03-07 16:14:08
  • 1425

【Java设计模式】之备忘录模式

备忘录(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。...
  • xiongwt
  • xiongwt
  • 2016-09-09 15:13:22
  • 490

Java设计模式20-备忘录模式

一、场景当我们使用文本编译器记录一些内容时,发现这一步写错了,往往可以使用Ctrl+Z的方式会退到上一个状态,其中运用到的知识就是备忘录模式。二、定义备忘录模式,即保存某个对象内部状态的拷贝,这样以后...
  • xu__cg
  • xu__cg
  • 2016-12-02 10:34:47
  • 733

C++设计模式——备忘录模式

前言 又到年底了,也静不下心来写代码了,大家都很浮躁;翻出经典的《仙剑奇侠传》玩一会;又要打大BOSS,先存一下档吧。这是我的习惯,在打大BOSS之前,都要先存一下档,要是打赢了,就再存一个档,...
  • caoshangpa
  • caoshangpa
  • 2016-10-28 14:35:19
  • 403

c++的设计模式之备忘录模式

备忘录模式就是能够存储当前状态,类似于玩游戏的时候可以不断的读档,同时在玩了新的游戏的时候,又可以更新到档案里。 #include #include using namespace std; /...
  • u013676711
  • u013676711
  • 2015-06-18 20:05:18
  • 1038

设计模式学习之备忘录模式

备忘录模式(Memento Pattern),是行为型模式设计模式之一,该模式用于保存对象当前状态,并且在之后可以再次恢复到此状态。备忘录模式实现的方式需要保证被保存的对象状态不能被对象从外部访问,目...
  • u012124438
  • u012124438
  • 2017-04-22 19:20:27
  • 569

iOS 设计模式 - 备忘录模式

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存的状态。 保存的是状态而不是对象本身。 一、使用步骤二、基本属性三、代码示例1.备忘录模...
  • Seal_Shile
  • Seal_Shile
  • 2016-02-26 19:18:48
  • 392

设计模式之备忘录模式

  • 2017年09月20日 16:00
  • 14KB
  • 下载
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 498
    排名: 10万+
    最新评论