关闭

设计模式 _备忘录模式

标签: 设计模式备忘录模式c++完整可运行代码新手
146人阅读 评论(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;
}

运行截图:



1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

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

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

大话设计模式—备忘录模式

备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保...
  • lmb55
  • lmb55
  • 2016-03-30 20:51
  • 1226

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

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

【C#设计模式-备忘录模式】

一.备忘录模式的定义: 在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 二.备忘录模式的结构和角色: 1.Originator(...
  • heyangyi_19940703
  • heyangyi_19940703
  • 2016-05-11 17:59
  • 5284

“备忘录模式”就这么简单

备忘录模式的官方定义: 在不破坏封装性的前提下,获取一个对象的内部状态,并在该对象之外保存这些状态。这样以后就可以通过该对象恢复到原先保存的状态。
  • u010425776
  • u010425776
  • 2015-08-26 20:22
  • 1290

Android设计模式(十二)-备忘录模式

备用录模式是一种行为型设计模式,用于保存对象当前的状态,以便之后可以再次恢复到此状态。备忘录模式要保证保存的对象状态不能被对象从外部访问,保护好被保存的这些对象状态的完整性以及内部实现不向外部暴露。定...
  • qq_25806863
  • qq_25806863
  • 2017-04-05 10:42
  • 552

设计模式总结之Mememto Pattern(备忘录模式)

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。
  • cooldragon
  • cooldragon
  • 2016-08-11 00:53
  • 699

【设计模式】备忘录模式

设计模式总结链接 备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式。   备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用...
  • Small_Mouse0
  • Small_Mouse0
  • 2017-04-09 13:49
  • 527

JS学习十五天----设计模式开篇

JS设计模式开篇 前言 作为小小程序员一枚,除了敲个hello,world以后啥都不会了,最近发现设计模式这个东西挺好,想搞一下,声明,本屌不是一个看见什么好,什么新潮就追什么的人,本屌还是一个比...
  • shanyongxu
  • shanyongxu
  • 2015-08-15 19:28
  • 1024

iOS设计模式之四:备忘录模式和命令模式

原文出处: raywenderlich   译文出处: xmuzyq(@Krq_Tiger)。欢迎加入技术翻译小组。 备忘录(Memento)模式 备忘录模式快照对象的内部状态并将其保...
  • xdrt81y
  • xdrt81y
  • 2014-04-18 17:25
  • 1680
    个人资料
    • 访问:10131次
    • 积分:441
    • 等级:
    • 排名:千里之外
    • 原创:32篇
    • 转载:3篇
    • 译文:0篇
    • 评论:6条
    最新评论