设计模式----Memento(备忘录)

备忘录模式解析
本文介绍备忘录设计模式的应用,通过窄接口实现对象状态的保存与恢复,避免破坏封装性。提供C++代码示例,展示如何创建备忘录以存储对象状态,并在需要时恢复到先前状态。

作用:

  在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态.

  UML结构图:

设计模式的解析和实现(C++)之十九-Memento模式

  解析:

  Memento模式中封装的是需要保存的状态,当需要恢复的时候才取出来进行恢复.原理很简单,实现的时候需要注意一个地方:窄接口和宽接口.所谓的宽接口就是一般意义上的接口,把对外的接口作为public成员;而窄接口反之,把接口作为private成员,而把需要访问这些接口函数的类作为这个类的友元类,也就是说接口只暴露给了对这些接口感兴趣的类,而不是暴露在外部.下面的实现就是窄实现的方法来实现的.

#include <string> #include <iostream> using namespace std; class Memento; class Originator { public: Originator(const string& rstring); Originator(); ~Originator(); Memento * CreateMemento(); void SetMemento(Memento* pMemento); string Getstring(); void Setstring(const string& rstring); void Restorestring(Memento* pMemento); void Printstring(); private: string m_string; }; // 把Memento的接口函数都设置为私有的,而Originator是它的友元, // 这样保证了只有Originator可以对其访问 class Memento { private: friend class Originator; Memento (const string& rstring); void Setstring(const string& rstring); string Getstring(); string m_string; }; Originator::Originator() { } Originator::Originator(const string& rstring) : m_string(rstring) { } Originator::~Originator() { } string Originator::Getstring() { return m_string; } void Originator::Setstring(const string& rstring) { m_string = rstring; } Memento* Originator::CreateMemento() { return new Memento(m_string); } void Originator::Restorestring(Memento* pMemento) { if (NULL != pMemento) { m_string = pMemento->Getstring(); } } void Originator::Printstring() { std::cout << "string = " << m_string << std::endl; } Memento::Memento(const string& rstring) : m_string(rstring) { } string Memento::Getstring() { return m_string; } void Memento::Setstring(const string& rstring) { m_string = rstring; } int main() { // 创建一个原发器 Originator* pOriginator = new Originator("old string"); pOriginator->Printstring(); // 创建一个备忘录存放这个原发器的状态 Memento *pMemento = pOriginator->CreateMemento(); // 更改原发器的状态 pOriginator->Setstring("new string"); pOriginator->Printstring(); // 通过备忘录把原发器的状态还原到之前的状态 pOriginator->Restorestring(pMemento); pOriginator->Printstring(); delete pOriginator; delete pMemento; return 0; }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值