博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用最简单的例子理解备忘录模式(Memento Pattern)
阅读量:4986 次
发布时间:2019-06-12

本文共 1569 字,大约阅读时间需要 5 分钟。

简单来说,备忘录模式就是支持回退操作。假设让一个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
undos = new List
();
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查看信息看到的是空字符串。   

转载于:https://www.cnblogs.com/darrenji/p/3963557.html

你可能感兴趣的文章
ajax同步,加载loading的bug
查看>>
秒杀多线程第二篇 多线程第一次亲密接触 CreateThread与_beginthreadex本质区别
查看>>
div滚动条
查看>>
iOS越狱程序开发
查看>>
调用其他类的方法
查看>>
SQlite数据库
查看>>
一些常用的js,jquerry 样例
查看>>
Oracle PL/SQL 多重选择句
查看>>
tyvj1659中中救援队
查看>>
kubernetes学习:CKA考试题
查看>>
LINUX samba的安装使用
查看>>
CSS border 生成三角
查看>>
asp.net(c#)开发中的文件上传组件uploadify的使用方法(带进度条)
查看>>
7.STM32中GPIO理解
查看>>
base64 json
查看>>
排序算法(一) —— 冒泡排序
查看>>
No.026:Remove Duplicates from Sorted Array
查看>>
SpringBoot项目的几种创建方式,启动、和访问
查看>>
解决"disabled". Expected Boolean, got Number with value 0
查看>>
OC--init,initialize,initWithCoder:,initWithFrame:各方法的区别和加载顺序
查看>>