设计模式:备忘录模式

备忘录模式允许在不破坏封装性的前提下,记录并恢复对象的内部状态。通过创建备忘录类和管理类,发起人可以创建备忘录以保存状态,管理者则负责保存和提供备忘录。当需要撤销操作时,发起人使用备忘录恢复到先前状态。这种模式在需要撤销/重做功能的场景中非常有用,但可能消耗大量内存资源。

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

备忘录模式(Memento)

  • 介绍:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。
    备忘录模式能记录一个对象的内部状态,当用户后悔时能撤销当前操作,使数据恢复到它原先的状态。
    备忘录模式的核心是设计备忘录类以及用于管理备忘录的管理者类。

  • 优点:
    提供了一种可以恢复状态的机制。当用户需要时能够比较方便地将数据恢复到某个历史的状态。
    实现了内部状态的封装。除了创建它的发起人之外,其他对象都不能够访问这些状态信息。
    简化了发起人类。发起人不需要管理和保存其内部状态的各个备份,所有状态信息都保存在备忘录中,并由管理者进行管理,这符合单一职责原则。

  • 缺点:资源消耗大。如果要保存的内部状态信息过多或者特别频繁,将会占用比较大的内存资源。

  • 主要角色。
    发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。
    备忘录(Memento)角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。
    管理者(Caretaker)角色:对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。

class MementoBase
{
public:
	MementoBase(){}
	virtual string GetState() = 0;
	virtual void SetState(string state) = 0;
};

class OriginatorBase
{
public:
	OriginatorBase(){}
	virtual string GetState() = 0;
	virtual void SetState(string state) = 0;
};

//备忘录
class Memento : public MementoBase
{
public:
	Memento(){ m_state = ""; }
	Memento(OriginatorBase *or)
	{
		m_state = or->GetState();
	}
	void SetState(string state){
		m_state = state;
	}
	string GetState(){
		return m_state;
	}
private:
	string m_state;
};

//发起人
class Originator: public OriginatorBase
{
public:
	Originator(){
		m_state = "";
	}
	Originator(string state) :m_state(state){}

	void SetState(string state){
		m_state = state;
		cout << m_state << endl;
	}
	string GetState(){
		return m_state;
	}
	
	//创建备忘录对象
	Memento *CreateMemento()
	{
		return new Memento(this);
	}
	//利用备忘录对象恢复原发器状态
	void RestoreMemento(MementoBase *m)
	{
		m_state = m->GetState();
		cout << m_state << endl;
	}
private:
	string m_state;
};



//管理者
class Caretaker
{
public:
	Caretaker(){}
	Memento *GetMemento()
	{
		return pMemento;
	}
	void SetMemento(Memento *m)
	{
		pMemento = m;
		cout << m->GetState() << endl;
	}

private:
	Memento *pMemento;
};
int main()
{
	//创建原发器对象
	Originator *Ori = new Originator("状态1");
	//创建负责人对象
	Caretaker *Ca = new Caretaker();
	Ca->SetMemento(Ori->CreateMemento());

	Ori->SetState("状态2");

	// 从负责人对象中取出备忘录对象,实现撤销
	Ori->RestoreMemento(Ca->GetMemento());

	system("pause");
	return 1;
}

设计模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值