首页 > 代码库 > 备忘录模式之C++实现
备忘录模式之C++实现
说明:本文仅供学习交流,转载请标明出处,欢迎转载!
备忘录模式是一种比较简单的设计模式,该模式很好地体现了一种面向对象的封装思想。该模式的思想是用一个专门的备份类将当前的状态信息保存起来,在整个过程中用户不能直接接触该备份类,为了达到这个目的,需要创建一个管理类,用户对先前的信息进行备份和还原。这样,如果用户想备份当前信息或者还原至前一个状态,我们可以通过该管理类的对象来调用备份函数和还原函数。当然,我们所看到的所有状态都是由一个运行类提供。
为了说明上面的思想,我们将上面所提到的运行类用Originator表示,备忘类用Memento表示,管理类用Caretaker表示。同时各个类都有分工:运行类用于运行当前的状态,管理类用于备份和恢复状态,备忘类则是一种底层的数据结构(用于保存状态信息),是管理类和运行类沟通的桥梁。
备忘录模式(Memento)的定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态。
备忘录模式的结构:
本图来自《大话设计模式》
C++实现代码:
#include<iostream> #include<string> using namespace std; class Memento//用于保存之前信息的类,这个类不与客户端打交道 { private: string state;//用于保存之前状态 public: Memento(){} Memento(string s):state(s){}; string GetState(){return state;} }; class Originator//行动发起者类,总是对应现在进行时,客户端用这个类进行正常的操作 { private: string state;//对应的状态为当前的状态 public: void SetState(string state)//设置状态信息 { this->state=state; } Memento CreateMemento()//返回当前的信息 { return Memento(state); } void SetMento(Memento mem) { this->state=mem.GetState(); } void Show() { cout<<"当前状态为:"<<state<<endl; } }; class CareTaker//管理者,用户端用这个类进行数据的备份 { private: Memento memento;//所有的备份信息都保存在对象mem中 public: Memento GetMemento()//返回备份信息的对象 { return memento; } void SetMemento(Memento men)//备份信息 { this->memento=men; cout<<"当前状态信息已备份!"<<endl; } }; int main()//客户端程序 { Originator org; /*******显示当前的状态信息*******/ cout<<"显示当前状态..."<<endl; org.SetState("打开状态!");//将当前的状态设置为打开状态 org.Show(); /*******备份当前的状态信息*******/ cout<<endl<<"备份当前的状态信息..."<<endl; CareTaker ct; ct.SetMemento(org.CreateMemento());//备份当前状态信息 /*******设置新的状态*******/ cout<<endl<<"重新设置当前的状态...."<<endl; org.SetState("关闭状态!"); org.Show(); /********恢复先前的状态*******/ cout<<endl<<"恢复先前的状态....."<<endl; org.SetMento(ct.GetMemento()); org.Show(); return 0; }
测试结果如下:
参考资料:
[1]《大话设计模式》
[2]《设计模式之禅》
[3]《HeadFirst设计模式》
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。