用最简单的例子理解备忘录模式(Memento Pattern)
简单来说,备忘录模式就是支持回退操作。假设让一个Notepad支持回退操作,如何实现呢?
首先需要一个备忘录类。
public class Memento{private string _msg;public Memento(string msg){_msg = msg;}public string GetText(){return _msg;}}
以上,
○ 构造函数在Nodepad每次记录信息的时候调用,Nodepad所记录的信息最终通过该构造函数赋值给了_msg字段。
○ GetText方法在Nodepad执行回退操作的时候调用
接下来就是Nodepad类。
public class Notepad{private string _msg;public Memento SetMsg(string msg){Memento m = new Memento(msg);_msg = msg;return m;}public string GetMsg(){return _msg;}public void Undo(Memento previousState){if (previousState != null){_msg = previousState.GetText();}else{_msg = "";}}}
○ 维护着一个类型为string的字段_msg,代表显示在Nodepad上的文字
○ 记录信息方法SetMsg:不仅要把记录的信息赋值给_msg,还要把信息传递给备忘录类
○ 获取信息方法GetMsg:读取_msg
○ 回退操作方法Undo:把备忘录的上一次信息赋值给_msg。如果回退到第一次以前的操作,相当于备忘录为null,需要考虑为null的情况
客户端需要有一个备忘录的列表,维护者所有的备忘录信息。
class Program{static void Main(string[] args){IList<Memento> undos = new List<Memento>();Notepad notepad = new Notepad();Memento undo;undo = notepad.SetMsg("Hello");undos.Add(undo);undo = notepad.SetMsg("World");undos.Add(undo);Console.WriteLine("进入Nodepad查看信息");Console.WriteLine(notepad.GetMsg());Console.WriteLine("1、接着执行一个回退操作");notepad.Undo(undos[0]);Console.WriteLine("回退操作以后查看信息");Console.WriteLine(notepad.GetMsg());Console.WriteLine("2、再执行一个回退操作");notepad.Undo(null);Console.WriteLine("回退操作以后再查看信息");Console.WriteLine(notepad.GetMsg());Console.ReadKey();}}

○ 第一次进入Notepad查看信息看到的是最后一次输入的World;
○ 回退一次,第二次进入Notepad查看信息看到的是第一次输入的Hello;
○ 再回退一次,第三次进入Notepad查看信息看到的是空字符串。
用最简单的例子理解备忘录模式(Memento Pattern)的更多相关文章
- 用最简单的例子理解复合模式(Composite Pattern)
在显示树形结构时,复合模式有很好的体现.本篇显示如下部门结构: 以上,有的节点包含子节点,有的节点部包含子节点.不管是什么节点,每个节点就代表一个部门. 首先设计一个关于部门的抽象基类. public ...
- 用最简单的例子理解命令模式(Command Pattern)
假设想让遥控器控制电灯的开关.电视机的开关和切换,该如何做? 所有的开.关.切换都是遥控器发出的指令,把这些指令统一抽象成一个接口. public interface IControl { void ...
- 用最简单的例子理解迭代器模式(Iterator Pattern)
迭代器模式的需求来自:需要对一些集合进行迭代,而迭代的方式可能有很多种. 说到迭代,动作大致包括设置第一个位置,获取下一个位置元素,判断是否迭代结束,获取当前位置元素,大致就这么些.把这些迭代动作封装 ...
- 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern)
原文:乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) 作者:webabc ...
- 备忘录模式-Memento Pattern(Java实现)
备忘录模式-Memento Pattern Memento备忘录设计模式是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到以前保存的状态. 本文中的场景: 有一款游戏可以随时存档, ...
- 二十四种设计模式:备忘录模式(Memento Pattern)
备忘录模式(Memento Pattern) 介绍在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到保存的状态. 示例有一个Message实体类,某 ...
- 23.备忘录模式(Memento Pattern)
using System; using System.Collections.Generic; namespace ConsoleApplication6 { /// <summary> ...
- [设计模式] 18 备忘录模式Memento Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对备忘录模式是这样说的:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存 ...
- 备忘录模式-Memento Pattern
1.主要优点 备忘录模式的主要优点如下: (1)它提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原. (2) ...
随机推荐
- linux内核之accept实现
用户态对accept的标准用法: if ((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size) ...
- SQL SERVER2008 存储过程、表、视图、函数的权限
EXEC sp_addrolemember N'db_owner', N'db'----将db 设置为 db_owner 角色中的一员 EXEC sp_droprolemember N'db_owne ...
- SQL Server和Access数据读写
1.查询Access中数据的方法: select * from OpenRowSet('microsoft.jet.oledb.4.0',';database=c:/db2.mdb','select ...
- Oracle约束
1.非空约束 DROP TABLE member PURGE; CREATE TABLE member( mid NUMBER, name ) NOT NULL ); 2.唯一约束 DROP TABL ...
- mysql关联表插入-php环境中
$insertsql=<<<EOTinsert into tb_manager values(null,'$name','$pwd','1');select @pid:=last_i ...
- Android四大组件-服务
Android服务 android 的服务有点类似windows的服务,没有界面,在后台长时间运行,如果我们这种需求的话我们就可以使用服务来实现. 服务的典型应用场景: 播放音乐,下载等,如果要在一个 ...
- opencv 加载 修改 保存 图像
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; /* 1 加载图像 cv::imre ...
- Questions(Updating)
有时候做题时会遇到一些未学习的零碎知识点,或存疑的疑惑 为防止遗忘,在此记录 1.复数除法与线性变换的关系 Accepted Codeforces 8D(2018.5.9) Definition: 复 ...
- 洛谷.3803.[模板]多项式乘法(NTT)
题目链接:洛谷.LOJ. 为什么和那些差那么多啊.. 在这里记一下原根 Definition 阶 若\(a,p\)互质,且\(p>1\),我们称使\(a^n\equiv 1\ (mod\ p)\ ...
- 【推导】【贪心】Codeforces Round #472 (rated, Div. 2, based on VK Cup 2018 Round 2) D. Riverside Curio
题意:海平面每天高度会变化,一个人会在每天海平面的位置刻下一道痕迹(如果当前位置没有已经刻划过的痕迹),并且记录下当天比海平面高的痕迹有多少条,记为a[i].让你最小化每天比海平面低的痕迹条数之和. ...