《设计模式》学习笔记——备忘录模式

46 篇文章 1 订阅
27 篇文章 0 订阅

        备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。
意图:
    在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
主要解决:
    所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
    这样可以在以后将对象恢复到原先保存的状态。
何时使用:
    很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作。
    能够恢复到他原先的状态,使得他有"后悔药"可吃。
如何解决:
    通过一个备忘录类专门存储对象状态。
关键代码:
    客户不与备忘录类耦合,与备忘录管理类耦合。    
应用实例:
    1、后悔药。 
    2、打游戏时的存档。
    3、Windows 里的 ctri + z。 
    4、IE 中的后退。 
    4、数据库的事务管理。
优点: 
    1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。
    2、实现了信息的封装,使得用户不需要关心状态的保存细节。
缺点:
    消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
使用场景: 
    1、需要保存/恢复数据的相关状态场景。 
    2、提供一个可回滚的操作。
注意事项: 
    1、为了符合迪米特原则,还要增加一个管理备忘录的类。 
    2、为了节约内存,可使用原型模式+备忘录模式。

MementoPattern.h

#pragma once
#include<iostream>
#include<string>

// 备忘录
class MementoPattern
{
public:
public:
	MementoPattern() {}
	MementoPattern(std::string name, int age) :m_name(name), m_age(age) {}
	~MementoPattern() {}

	void setName(std::string name) { m_name = name; }
	void setAge(int age) { m_age = age; }

	std::string getName(void) { return m_name; }
	int getAge(void) { return m_age; }

private:
	std::string m_name;
	int m_age;
};

//人
class Person
{
public:
	Person() {}
	Person(std::string name, int age) :m_name(name), m_age(age) { m_mementopattern = nullptr; }
	~Person() {}

	void setName(std::string name) { m_name= name; }
	void setAge(int age) { m_age= age; }

	std::string getName(void) {return m_name;}
	int getAge(void) { return m_age; }
	// 创建备忘录
	MementoPattern* creatMemento(void) 
	{
		m_mementopattern= new MementoPattern(this->m_name,this->m_age);
		return m_mementopattern;
	}

	// 从备忘录恢复
	void replyMemento(void)
	{
		this->m_name= (this->m_mementopattern->getName());
		this->m_age= (this->m_mementopattern->getAge());
	}
	// 重载一个版本
	void replyMemento(MementoPattern* mementopattern)
	{
		this->m_name = mementopattern->getName();
		this->m_age = mementopattern->getAge();
	}

	void printInf(void)
	{
		std::cout << "name:"<<m_name<<"  age:" <<m_age << std::endl;
	}
private:
	std::string m_name;
	int m_age;
	MementoPattern* m_mementopattern;			// 自己管理一个备忘录
protected:

};

// 备忘录管理者,另外管理
class Caretaker
{
public:
	Caretaker(MementoPattern * mementopattern):m_mementopattern(mementopattern){}
	~Caretaker() {}

	MementoPattern* getMemento(void)
	{
		return m_mementopattern;
	}
	void setMemento(MementoPattern* mementopattern)
	{
		m_mementopattern = mementopattern;
	}
private:
	MementoPattern * m_mementopattern;			// 备忘录
protected:

};


 

MementoPattern.cpp

#include "MementoPattern.h"

 

mainTest.cpp

#include<iostream>
#include<string>
#include "MementoPattern.h"


int mainTest1(void)
{
	Person* person = new Person("张三",29);
	person->printInf();
	// 设置备忘
	person->creatMemento();
	// 更该数据
	person->setAge(0);
	person->setName(" ");
	person->printInf();
	// 从备忘录回复
	person->replyMemento();
	person->printInf();

	return 0;
}

int mainTest2(void)
{
	// 声明一个备忘录管理者
	Caretaker* caretaker = nullptr;
	Person* person = new Person("张三", 29);
	person->printInf();
	// 设置备忘,同时创建备忘录管理者
	caretaker = new Caretaker(person->creatMemento());

	// 更该数据
	person->setAge(0);
	person->setName(" ");
	person->printInf();
	// 从备忘录回复
	person->replyMemento(caretaker->getMemento());
	person->printInf();

	return 0;
}
int main(void)
{
	//mainTest1();
	mainTest2();
	system("pause");
	return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值