设计模式之备忘录模式(C++)

设计模式之备忘录模式

备忘录,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。该模式很好理解,其UML图如下:
备忘录模式UML图
在Originator中提供了创建Memento的接口,具体要保存什么样的内容,则根据需求来定。而Caretaker则是负责管理Memento。而保存的内容的具体的组织方式什么的都封装在Memento中了。这样做耦合性很低,方便维护和扩展。示例代码如下:

// MemoModel.h文件
#pragma once
#include <iostream>
#include <string>

class Memo;

class Originator
{
private:
	std::string m_state;
public:
	Memo * createMemo();
	void show()
	{
		std::cout << m_state << std::endl;
	}
	void setState(std::string str)
	{
		m_state = str;
	}
	void recoverState(Memo * p);
};

class Memo
{
public:
	std::string m_state;
	Memo(std::string str)
	{
		m_state = str;
	}

};

Memo * Originator::createMemo()
{
	return new Memo(m_state);
}

void Originator::recoverState(Memo * p)
{
	setState(p->m_state);
}

class Caretaker
{
private:
	Memo * m_pMemo;
public:
	Caretaker() : m_pMemo(nullptr) {}
	~Caretaker()
	{
		if (nullptr != m_pMemo)
			delete m_pMemo;
	}
	Memo * getMemo()
	{
		return m_pMemo;
	}
	void setMemo(Memo * p)
	{
		m_pMemo = p;
	}
};

测试代码如下:

#include <iostream>
#include "MemoModel.h"

int main()
{
	using namespace std;
	// 备忘录模式
	Originator * p = new Originator;
	Caretaker * pCare = new Caretaker;
	// 设置状态
	p->setState("A");
	p->show();
	// 创建备忘录
	pCare->setMemo(p->createMemo());
	// 更改状态
	p->setState("B");
	p->show();
	// 恢复状态
	p->recoverState(pCare->getMemo());
	p->show();
	delete pCare;
	delete p;

	getchar();
	return 0;
}

测试结果如下图:
在这里插入图片描述
备忘录模式把要保存的细节封装在了Memo类中,如果要修改保存细节的话,不会影响到客户端。备忘录模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值