备忘录模式之C++实现
说明:本文仅供学习交流。转载请标明出处,欢迎转载。
备忘录模式是一种比較简单的设计模式。该模式非常好地体现了一种面向对象的封装思想。
该模式的思想是用一个专门的备份类将当前的状态信息保存起来。在整个过程中用户不能直接接触该备份类,为了达到这个目的。须要创建一个管理类,用户对先前的信息进行备份和还原。这样,假设用户想备份当前信息或者还原至前一个状态,我们能够通过该管理类的对象来调用备份函数和还原函数。
当然,我们所示全部状态都是由一个执行类提供。
为了说明上面的思想,我们将上面所提到的执行类用Originator表示。备忘类用Memento表示,管理类用Caretaker表示。同一时候各个类都有分工:执行类用于执行当前的状态。管理类用于备份和恢复状态,备忘类则是一种底层的数据结构(用于保存状态信息),是管理类和执行类沟通的桥梁。
备忘录模式(Memento)的定义:在不破坏封装性的前提下。捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就能够将该对象恢复到原先保存的状态。
备忘录模式的结构:
本图来自《大话设计模式》
C++实现代码:
#include<iostream>
#include<string>
using namespace std;
class Memento//用于保存之前信息的类,这个类不与client打交道
{
private:
string state;//用于保存之前状态
public:
Memento(){}
Memento(string s):state(s){};
string GetState(){return state;}
}; class Originator//行动发起者类,总是相应如今进行时,client用这个类进行正常的操作
{
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()//client程序
{
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;
}
測试结果例如以下:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSlhIXzEyMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
參考资料:
[1]《大话设计模式》
[2]《设计模式之禅》
[3]《HeadFirst设计模式》
备忘录模式之C++实现的更多相关文章
- MementoPattern(备忘录模式)
/** * 备忘录模式 * @author TMAC-J * 用于存储bean的状态 */ public class MementoPattern { public class Memento{ pr ...
- C#设计模式-备忘录模式
访问者模式的实现是把作用于某种数据结构上的操作封装到访问者中,使得操作和数据结构隔离.而本文要介绍的备忘者模式与命令模式有点相似,不同的是,命令模式保存的是发起人的具体命令(命令对应的是行为),而备忘 ...
- C#设计模式系列:备忘录模式(Memento)
1.备忘录模式简介 1.1>.定义 备忘录模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以将该对象恢复到原先保存的状态. 1.2>.使用频率 ...
- php实现设计模式之 备忘录模式
<?php /*备忘录模式:在不破坏封装的前提下,获取对象的内部状态,并且在对象外保存该状态.这样就可以将该对象恢复到保存之前的状态(行为模式) * * 发起人:记录当前时刻的内部状态,负责定义 ...
- java设计模式之备忘录模式
备忘录模式 备忘录模式是一种软件设计模式:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态.一听到备忘录这个字的时候想起了小小时打的游 ...
- 备忘录模式(Memento Pattern)
在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 备忘录模式主要思想是——利用备忘录对象来对保存发起人的内部状态,当发起人需要恢复原 ...
- C++设计模式-Memento备忘录模式
Memento模式作用:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态. UML图: Originator:负责创建一个备忘录Me ...
- C++设计模式-备忘录模式(1)
备忘录模式:备忘录对象时一个用来存储另外一个对象内部状态的快照对象. 备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住并外部化,存储起来从而可以在将来合适的时候把这个对象还原到存储起来的状 ...
- JAVA 设计模式 备忘录模式
用途 备忘录模式 (Memento) 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态. 这样以后就可将该对象恢复到原先保存的状态. 备忘录模式是一种行为型模式. 结构
- 【GOF23设计模式】备忘录模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_备忘录模式.多点备忘.事务操作.回滚数据底层架构 package com.test.memento; /** * 源发器类 ...
随机推荐
- Java多线程学习笔记(四)——Thread类中方法介绍
currentThread():返回代码正在被哪个线程调用. public class CurrentThreadWay { public static void main(String[] args ...
- 踩过好多次的坑 - ajax访问【mango】项目的service
这个坑真的是踩过好多次了,好记性不如烂笔头,我总是太高估我的记忆力,这次真的是要写下来了. 项目是用的seam框架 + hibernate搭建的,架构是前辈们搭好的劳动成果,在配置service的访问 ...
- windows服务器修改远程登录的端口+防火墙配置
话不多说,一个bat文件,快速修改注册表端口.你只需要做的是另外防火墙添加例外端口后重启即可.经测试2008-2012-2016-2019正常使用! @echo off rem 查找端口号 for / ...
- 15Microsoft SQL Server 数据库维护
Microsoft SQL Server 数据库维护 2.6.1数据库联机与脱机 --联机:该状态为数据库正常状态,也就是我们常看到的数据库的状态,该状态下的数据库处于可操作状态,可以对数据库进行任何 ...
- svn无法显示日期和作者
当遇到这种情况,只要把这个read改为none就可以显示了 亲测绝对管用
- Autolayout性能优化
客户的需求就是我们进步的动力.最近有客户提出大数据量Topo图的自动布局问题,在Topo中除了Node.Link,还包括Group.Subnetwork等容器组件.在这样的情况下,我们抛开布局算法不谈 ...
- Xcode git 忽略user interface state文件
退出xcdoe, 打开终端(Terminal),进入到你的项目目录下 在终端输入如下代码 git rm --cached *.xcuserstate git commit -m "Remov ...
- [Luogu] P1993 小K的农场
题目描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述: 农场a比农场b至少多种植了c个单位的作 ...
- FileWriter实现从一个文件中读取内容并写到另一个文件中
FileWriter和FileOutputStream都是向文件写内容,区别是前台一次写一个字符,后者一次写一个字节 package com.janson.day20180827; import ja ...
- 【07】AngularJS Filters
AngularJS Filters 过滤器可以使用一个管道字符(|)添加到表达式和指令中. AngularJS 过滤器 AngularJS 过滤器可用于转换数据: 过滤器 描述 currency[ˈk ...