一,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)的更多相关文章

  1. 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern)

    原文:乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) 作者:webabc ...

  2. 二十四种设计模式:备忘录模式(Memento Pattern)

    备忘录模式(Memento Pattern) 介绍在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到保存的状态. 示例有一个Message实体类,某 ...

  3. 备忘录模式-Memento Pattern(Java实现)

    备忘录模式-Memento Pattern Memento备忘录设计模式是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到以前保存的状态. 本文中的场景: 有一款游戏可以随时存档, ...

  4. [设计模式] 18 备忘录模式Memento Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对备忘录模式是这样说的:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存 ...

  5. [工作中的设计模式]备忘录模式memento

    一.模式解析 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象.备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住,并外部化,存储起来,从而可以在将来合适的时候把 ...

  6. 23.备忘录模式(Memento Pattern)

    using System; using System.Collections.Generic; namespace ConsoleApplication6 { /// <summary> ...

  7. 备忘录模式-Memento Pattern

    1.主要优点 备忘录模式的主要优点如下: (1)它提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原. (2) ...

  8. 用最简单的例子理解备忘录模式(Memento Pattern)

    简单来说,备忘录模式就是支持回退操作.假设让一个Notepad支持回退操作,如何实现呢? 首先需要一个备忘录类. public class Memento { private string _msg; ...

  9. php备忘录模式(memento pattern)

    晚上刷起来. <?php /* The memento pattern provides the object restore functionality. Implementation is ...

  10. 十一个行为模式之备忘录模式(Memento Pattern)

    定义: 在不破坏原有封装的情况下,捕获一个对象的内部状态,并在对象之外保存.当对象出错或者无效是,可以根据该备忘录进行恢复. 结构图: Originator:原发类,被记录的对象,包含若干内部状态.一 ...

随机推荐

  1. cocos2d 15款游戏源码

    https://blog.csdn.net/jailman/article/details/78678972

  2. Node.js 几个重启工程的工具

    pm2, forever, nodemon, supervisor 均可在 npm 查找相关资料和用法. 线上工程推荐 pm2 开发推荐 supervisor

  3. pycharm selenium 安装firefox驱动和Google驱动教程

    一.下载Firefox浏览器或Google浏览器 下载渠道有很多,直接下载最新版的就可以了. 二.下载驱动 Firefox驱动 地址:https://github.com/mozilla/geckod ...

  4. [学习笔记] Gibbs Sampling

    Gibbs Sampling Intro Gibbs Sampling 方法是我最近在看概率图模型相关的论文的时候遇见的,采样方法大致为:迭代抽样,最开始从随机样本中抽样,然后将此样本作为条件项,按条 ...

  5. C++ STL unordered_map

    容器unordered_map<key type,value tyep>m; 迭代器unordered_map<key type,value tyep>::iterator i ...

  6. Spring 缓存注解 SpEL 表达式解析

    缓存注解上 key.condition.unless 等 SpEL 表达式的解析 SpEl 支持的计算变量: 1)#ai.#pi.#命名参数[i 表示参数下标,从 0 开始] 2)#result:Ca ...

  7. Git-Runoob:Git 基本操作

    ylbtech-Git-Runoob:Git 基本操作 1.返回顶部 1. Git 基本操作 Git 的工作就是创建和保存你项目的快照及与之后的快照进行对比.本章将对有关创建与提交你的项目快照的命令作 ...

  8. java中? extends T 和? super T解析

    转:https://blog.csdn.net/qq_25337221/article/details/81669630 PECS原则 最后看一下什么是PECS(Producer Extends Co ...

  9. 中国MOOC_面向对象程序设计——Java语言_第2周 对象交互_1有秒计时的数字时钟

    第2周编程题 查看帮助 返回   第2周编程题,在课程所给的时钟程序的基础上修改 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系 ...

  10. mysql --> select * from Employee group by name这样的语法有什么意义?

    神奇的mysql才会支持select * from Employee group by name 这种反逻辑的SQL(假定该表非仅name一个列) mysql 的逻辑是:select 的返回字段,如果 ...