常见设计模式的解析和实现(C++)之十九-Memento模式
来源:互联网 发布:idea mac 激活服务器 编辑:程序博客网 时间:2024/05/22 13:53
作用:
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态.
UML结构图:
解析:
Memento模式中封装的是需要保存的状态,当需要恢复的时候才取出来进行恢复.原理很简单,实现的时候需要注意一个地方:窄接口和宽接口.所谓的宽接口就是一般意义上的接口,把对外的接口作为public成员;而窄接口反之,把接口作为private成员,而把需要访问这些接口函数的类作为这个类的友元类,也就是说接口只暴露给了对这些接口感兴趣的类,而不是暴露在外部.下面的实现就是窄实现的方法来实现的.
实现:
1)Memento.h
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态.
UML结构图:
解析:
Memento模式中封装的是需要保存的状态,当需要恢复的时候才取出来进行恢复.原理很简单,实现的时候需要注意一个地方:窄接口和宽接口.所谓的宽接口就是一般意义上的接口,把对外的接口作为public成员;而窄接口反之,把接口作为private成员,而把需要访问这些接口函数的类作为这个类的友元类,也就是说接口只暴露给了对这些接口感兴趣的类,而不是暴露在外部.下面的实现就是窄实现的方法来实现的.
实现:
1)Memento.h
/******************************************************************** created: 2006/08/09 filename: Memento.h author: 李创 http://www.cppblog.com/converse/ purpose: Memento模式的演示代码*********************************************************************/#ifndef MEMENTO_H#define MEMENTO_H#include <string>typedef std::string State;class Memento;class Originator{public: Originator(const State& rState); Originator(); ~Originator(); Memento* CreateMemento(); void SetMemento(Memento* pMemento); State GetState(); void SetState(const State& rState); void RestoreState(Memento* pMemento); void PrintState();private: State m_State;};// 把Memento的接口函数都设置为私有的,而Originator是它的友元,// 这样保证了只有Originator可以对其访问class Memento{private: friend class Originator; Memento(const State& rState); void SetState(const State& rState); State GetState(); State m_State;};#endif2)Memento.cpp
/******************************************************************** created: 2006/08/09 filename: Memento.cpp author: 李创 http://www.cppblog.com/converse/ purpose: Memento模式的演示代码*********************************************************************/#include "Memento.h"#include <iostream>Originator::Originator(){}Originator::Originator(const State& rState) : m_State(rState){}Originator::~Originator(){}State Originator::GetState(){ return m_State;}void Originator::SetState(const State& rState){ m_State = rState;}Memento* Originator::CreateMemento(){ return new Memento(m_State);}void Originator::RestoreState(Memento* pMemento){ if (NULL != pMemento) { m_State = pMemento->GetState(); } }void Originator::PrintState(){ std::cout << "State = " << m_State << std::endl;}Memento::Memento(const State& rState) : m_State(rState){}State Memento::GetState(){ return m_State;}void Memento::SetState(const State& rState){ m_State = rState;}
3)Main.cpp
/******************************************************************** created: 2006/08/09 filename: Main.cpp author: 李创 http://www.cppblog.com/converse/ purpose: Memento模式的测试代码*********************************************************************/#include "Memento.h"int main(){ // 创建一个原发器 Originator* pOriginator = new Originator("old state"); pOriginator->PrintState(); // 创建一个备忘录存放这个原发器的状态 Memento *pMemento = pOriginator->CreateMemento(); // 更改原发器的状态 pOriginator->SetState("new state"); pOriginator->PrintState(); // 通过备忘录把原发器的状态还原到之前的状态 pOriginator->RestoreState(pMemento); pOriginator->PrintState(); delete pOriginator; delete pMemento; return 0;}
- 常见设计模式的解析和实现(C++)之十九-Memento模式
- 常见设计模式的解析和实现(C++)之十九-Memento模式
- 常见设计模式的解析和实现(C++)之十九-Memento模式
- 设计模式解析和实现(C++)之十九-Memento模式
- 常见设计模式的解析和实现(C++)---Adapt模式
- 常见设计模式之Memento模式
- 常见设计模式的解析和实现(C++)之二十-Visitor模式
- 常见设计模式的解析和实现(C++)之十八-Iterator模式
- 常见设计模式的解析和实现(C++)之十七-State模式
- 常见设计模式的解析和实现(C++)之十六-Strategy模式
- 常见设计模式的解析和实现(C++)之十五-Observer模式
- 常见设计模式的解析和实现(C++)之十四-Command模式
- 常见设计模式的解析和实现(C++)之十三-FlyWeight模式
- 常见设计模式的解析和实现(C++)之十二-ChainOfResponsibility模式
- 常见设计模式的解析和实现(C++)之十一-TemplateMethod模式
- 常见设计模式的解析和实现(C++)之十-Proxy模式
- 常见设计模式的解析和实现(C++)之九-Decorator模式
- 常见设计模式的解析和实现(C++)之八-Composite模式
- linux的命令行成了 -bash-3.2# 如何解决
- 转载Java反射详解
- 常见设计模式的解析和实现(C++)之十八-Iterator模式
- ORACLE同一个数据库下不同表结构之间的数据导入
- zip 的压缩原理与实现(lz77 算法压缩)
- 常见设计模式的解析和实现(C++)之十九-Memento模式
- Google+ Android版本更新绚丽界面 支持手机Hangout群聊
- 常见设计模式的解析和实现(C++)之二十-Visitor模式
- 图学PowerBuilder---实现Datawindow多选的函数
- iOS: 分步演示如何将iPhone应用移植至iPad平台
- 通过grep --help或者man grep查看grep命令用法
- 金庸小说数据化中的部分题目答案
- 常见设计模式的解析和实现(C++)之二十一-完结篇
- 分享17款免费的HTML5和CSS模板