C#设计模式:备忘录模式(Memento Pattern)
一,C#设计模式:备忘录模式(Memento Pattern)
1、发起人角色(Originator):记录当前时刻的内部状态,负责创建和恢复备忘录数据。负责创建一个备忘录Memento,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态。Originator【发起人】可以根据需要决定Memento【备忘录】存储自己的哪些内部状态。
2、备忘录角色(Memento):负责存储发起人对象的内部状态,在进行恢复时提供给发起人需要的状态,并可以防止Originator以外的其他对象访问备忘录。备忘录有两个接口:Caretaker【管理角色】只能看到备忘录的窄接口,他只能将备忘录传递给其他对象。Originator【发起人】却可看到备忘录的宽接口,允许它访问返回到先前状态所需要的所有数据。
3、管理者角色(Caretaker):负责保存备忘录对象。负责备忘录Memento,不能对Memento的内容进行访问或者操作。
二,代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace _22.备忘录模式
{ /// <summary>
/// 部门--需要备份的数据,是状态数据,没有操作
/// </summary>
public sealed class Dept
{
/// <summary>
/// 部门
/// </summary>
public string DeptName { get; set; } /// <summary>
/// 人数
/// </summary>
public string Number { get; set; }
} /// <summary>
/// 发起人--相当于【发起人角色】Originator
/// </summary>
public sealed class DeptBackOriginator
{
// 发起人需要保存的内部状态
private List<Dept> _deptList; public List<Dept> DeptList
{
get
{
return this._deptList;
} set
{
this._deptList = value;
}
}
/// <summary>
/// 初始化需要备份的部门
/// </summary>
/// <param name="deptList"></param>
public DeptBackOriginator(List<Dept> deptList)
{
if (deptList != null)
{
this._deptList = deptList;
}
else
{
throw new ArgumentNullException("参数不能为空!");
}
} /// <summary>
/// 创建备忘录对象实例,将当期要保存的联系人列表保存到备忘录对象中
/// </summary>
/// <returns></returns>
public DeptMemento CreateMemento()
{
return new DeptMemento(new List<Dept>(this._deptList));
} /// <summary>
/// 将备忘录中的数据备份还原到部门列表中
/// </summary>
/// <param name="memento"></param>
public void RestoreMemento(DeptMemento memento)
{
this.DeptList = memento.DeptListBack;
}
/// <summary>
/// 显示备份包含的数据
/// </summary>
public void Show()
{
Console.WriteLine("部门列表中共有{0}个部门,他们是:", DeptList.Count);
foreach (Dept p in DeptList)
{
Console.WriteLine("部门: {0} 人数: {1}", p.DeptName, p.Number);
}
}
} /// <summary>
/// 备忘录对象,用于保存状态数据,保存的是当时对象具体状态数据--相当于【备忘录角色】Memeto
/// </summary>
public sealed class DeptMemento
{
/// <summary>
/// 保存发起人创建的部门数据
/// </summary>
public List<Dept> DeptListBack { get; private set; } public DeptMemento(List<Dept> deptList)
{
DeptListBack = deptList;
}
} /// <summary>
/// 管理角色,它可以管理【备忘录】对象,如果是保存多个【备忘录】对象,当然可以对保存的对象进行增、删等管理处理---相当于【管理者角色】Caretaker
/// </summary>
public sealed class MementoCaretaker
{
/// <summary>
/// 如果想保存多个【备忘录】对象,通过字典或者堆栈来保存
/// </summary>
public Dictionary<string, DeptMemento> DeptMementoDictionary { get; set; }
/// <summary>
/// 单个备份点
/// </summary>
public DeptMemento DeptMemento { get; set; }
public MementoCaretaker()
{
DeptMementoDictionary = new Dictionary<string, DeptMemento>();
} } class Program
{
static void Main(string[] args)
{
List<Dept> dept = new List<Dept>()
{
new Dept() { DeptName="技术部", Number = ""},
new Dept() { DeptName="人事部", Number = ""},
new Dept() { DeptName="产品部", Number = ""}
}; #region 单个备份点 //手机名单发起人
DeptBackOriginator mobileOriginator = new DeptBackOriginator(dept);
mobileOriginator.Show(); // 创建备忘录并保存备忘录对象
MementoCaretaker manager = new MementoCaretaker();
manager.DeptMemento = mobileOriginator.CreateMemento(); ///创建第一个备份点
manager.DeptMementoDictionary.Add("One", mobileOriginator.CreateMemento()); // 更改发起人联系人列表
Console.WriteLine("----移除最后一个联系人--------");
mobileOriginator.DeptList.RemoveAt();
mobileOriginator.Show(); ///创建第二个备份点
Thread.Sleep(); //等待10秒
manager.DeptMementoDictionary.Add("Two", mobileOriginator.CreateMemento()); // 恢复到原始状态
Console.WriteLine("-------恢复联系人列表------");
mobileOriginator.RestoreMemento(manager.DeptMemento);
mobileOriginator.Show();
#endregion #region 多个备份点
Console.WriteLine("-------输出两个备份点------");
////输出备份点
foreach (var item in manager.DeptMementoDictionary)
{
mobileOriginator.RestoreMemento(item.Value);
mobileOriginator.Show();
}
Console.WriteLine("-------恢复到第一个备份点------");
mobileOriginator.RestoreMemento(manager.DeptMementoDictionary["One"]);
mobileOriginator.Show();
Console.WriteLine("-------恢复到第二个备份点------");
mobileOriginator.RestoreMemento(manager.DeptMementoDictionary["Two"]);
mobileOriginator.Show();
#endregion Console.Read();
}
}
}
C#设计模式:备忘录模式(Memento Pattern)的更多相关文章
- 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern)
原文:乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) 作者:webabc ...
- 二十四种设计模式:备忘录模式(Memento Pattern)
备忘录模式(Memento Pattern) 介绍在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到保存的状态. 示例有一个Message实体类,某 ...
- 备忘录模式-Memento Pattern(Java实现)
备忘录模式-Memento Pattern Memento备忘录设计模式是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到以前保存的状态. 本文中的场景: 有一款游戏可以随时存档, ...
- [设计模式] 18 备忘录模式Memento Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对备忘录模式是这样说的:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存 ...
- [工作中的设计模式]备忘录模式memento
一.模式解析 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象.备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住,并外部化,存储起来,从而可以在将来合适的时候把 ...
- 23.备忘录模式(Memento Pattern)
using System; using System.Collections.Generic; namespace ConsoleApplication6 { /// <summary> ...
- 备忘录模式-Memento Pattern
1.主要优点 备忘录模式的主要优点如下: (1)它提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原. (2) ...
- 用最简单的例子理解备忘录模式(Memento Pattern)
简单来说,备忘录模式就是支持回退操作.假设让一个Notepad支持回退操作,如何实现呢? 首先需要一个备忘录类. public class Memento { private string _msg; ...
- php备忘录模式(memento pattern)
晚上刷起来. <?php /* The memento pattern provides the object restore functionality. Implementation is ...
- 十一个行为模式之备忘录模式(Memento Pattern)
定义: 在不破坏原有封装的情况下,捕获一个对象的内部状态,并在对象之外保存.当对象出错或者无效是,可以根据该备忘录进行恢复. 结构图: Originator:原发类,被记录的对象,包含若干内部状态.一 ...
随机推荐
- AJAX 实例解析
AJAX 实例 为了帮助您理解 AJAX 的工作原理,我们创建了一个小型的 AJAX 应用程序: 实例 AJAX 不是新的编程语言,而是一种使用现有标准的新方法.深圳dd马达 AJAX 是与服务器交换 ...
- [jvm学习笔记]-类加载过程
JVM类加载的过程 加载=>验证=>准备=>解析=>初始化 5个阶段所执行的具体动作 加载 在加载阶段,虚拟机需要完成3个事情1.通过一个类的全限定名获取定义此类的二进制字节流 ...
- 【转】Python Schema一种优雅的数据验证方式
转自 https://segmentfault.com/a/1190000011777230 Schema是什么? 不管我们做什么应用,只要和用户输入打交道,就有一个原则--永远不要相信用户的输入数据 ...
- (56)Linux驱动开发之二
内核基础 1.li ...
- java中的同步和异步
摘自:https://www.cnblogs.com/caotao0918/p/10699785.html 在多线程的环境中,经常会碰到数据的共享问题,即当多个线程需要访问同一个资源时,它们需要以某种 ...
- 深入理解php的输出缓冲区(output buffer)
这篇文章是翻译自Julien Pauli的博客文章PHP output buffer in deep,Julien是PHP源码的资深开发和维护人员.这篇文章从多个方面讲解了PHP中的输出缓冲区以及怎么 ...
- hadoop stop-dfs.sh 无法停止 namenode datanode
原因: HADOOP_PID_DIR 默认为 /tmp 目录,如果长期不访问/tmp/目录下的文件,文件会被自动清理,因此 stop-dfs.sh 无法根据 pid 停止 namenode, data ...
- Mybaits解决实体类字段与数据库字段不一致问题
public class Employee { private Integer id; private String lastName; private String email; private S ...
- 系统分析与设计HW2
简答题 1. 简述瀑布模型.增量模型.螺旋模型(含原型方法)的优缺点. 瀑布模型 优点: 定义了软件开发基本流程与活动. 为项目提供了按阶段划分的检查点. 当前一阶段完成后,只需关注后续阶段. 缺点: ...
- Linux监控命令之==>vmstat
一.使用说明 vmstat 可以对操作系统的内存信息.进程状态.CPU 活动.磁盘等信息进行监控,不足之处是无法对某个进程进行深入分析. 二.用法及参数说明 -a:显示活跃和非活跃内存 -f:显示从系 ...