C++备忘录模式(Memento)

本文介绍了C++中的备忘录模式。该模式能在不破坏封装性的前提下,捕获并保存对象内部状态,让对象恢复到之前状态。还给出了UML类图和源码,其好处是提供恢复机制,方便用户回到历史状态,且实现信息封装,用户无需关心保存细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UML类图(仅供参考)如下:

备忘录模式解决的问题:

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,适当的时候可以让已经改变的对象恢复到之前的状态

源码

#include <string>
#include <iostream>

// 备份类,和需要备份的类一一对应
class CMemento
{
public:

	// 备份时调用
	void SetStatus(const std::string &sStatus)
	{
		m_sStatus = sStatus;
	}

	// 恢复时调用
	std::string GetStatus() const
	{
		return m_sStatus;
	}

private:

	// 假设这就是需要备份的状态
	// 当然可能有很多成员值需要备份
	std::string m_sStatus;
};

// 这个类需要备份
// 其实就是备份其中的成员
class COriginator
{
public:

	// 改变成员值
	void SetStatus(const std::string &sStatus)
	{
		this->m_sStatus = sStatus;
	}

	// 创建备份
	CMemento CreateMemento()
	{
		CMemento memento;
		memento.SetStatus(m_sStatus);
		return memento;
	}

	// 恢复备份
	void RegainMemento(const CMemento &memento)
	{
		this->m_sStatus = memento.GetStatus();
	}

	void ShowMemento() const
	{
		std::cout << "当前的备份为m_sStatus = " << m_sStatus << std::endl;
	}

private:

	// 需要备份的状态
	std::string m_sStatus;
};

// 备份管理类(可有可无)
// 是为了不在客户端暴露备份类
class CCaretaker
{
public:

	// 保存备份对象
	void SetMemento(const CMemento &memento)
	{
		m_Memento = memento;
	}

	// 取出备份对象
	CMemento GetMemento() const
	{
		return m_Memento;
	}

private:

	// 备份对象
	CMemento m_Memento;
};

int main()
{
	// 设置初始状态
	COriginator originator;
	originator.SetStatus("ON");
	originator.ShowMemento();

	// 保存备份
	CCaretaker caretaker;
	caretaker.SetMemento(originator.CreateMemento());

	// 改变状态
	originator.SetStatus("OFF");
	originator.ShowMemento();

	// 恢复备份
	originator.RegainMemento(caretaker.GetMemento());
	originator.ShowMemento();

	return 0;
}

好处

1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。

2、实现了信息的封装,使得用户不需要关心状态的保存细节

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值