一,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. Kotlin使用率达35%,Java要退位了?

    在今年的Google I/O大会上,关于Kotlin,Google只说了只言片语: 在过去一年里,有35%的专业Android开发者在使用Kotlin,其中95%的开发者都对Kotlin非常满意. 之 ...

  2. windows下 申请免费ssl证书的方法 (letsencrypt)

    Let's Encrypt,官网是https://letsencrypt.org/,它是一个由各大公司赞助的公益组织: 有趋势有需求,自然也有免费可用.免费的SSL证书中,首推就是Let's Encr ...

  3. es之主分片和复制分片的交互过程

    1:索引(创建或者删除)一个文档 首先:发送一个索引或者删除的请求给node1 其次:node1接收到请求之后,会根据请求中携带的参数“文档id”判断出该文档应该存储在具体哪一个shard中 shar ...

  4. springMVC @response 中文乱码解决

    以下任选一种 在web.xml中: 添加一个过滤器(filter),注册 org.springframework.web.filter.CharacterEncodingFilter <filt ...

  5. 20165220课程设计个人报告——Part4-Cortex M4模块

    个人报告: 20165220 葛宇豪 1.个人贡献 a.实验环境搭建 b.代码分析与理解 2.设计中遇到的问题以及解决方案 问题1:mdk5每次编译之前都会直接闪退 刚开始以为是环境问题,后来上网查资 ...

  6. SQL Server CDC最佳实践

    企业核心业务系统oltp的数据需要通过ETL同步到数据仓库,原始的ETL流程通过定制化从SQL Server中进行数据抽取,经过生产环境的监控,发现ETL过程的query会对生产系统造成额外负载.于是 ...

  7. C++获取寄存器eip的值

    程序中需要打印当前代码段位置 如下 #include <stdio.h> #include <stdlib.h> #include <math.h> #ifdef ...

  8. [论文笔记] Fine-Grained Head Pose Estimation Without Keypoints

    Fine-Grained Head Pose Estimation Without Keypoints 简介 head pose estimation 经典论文,使用CNN预测三个角度值,pitch, ...

  9. loj#6034 「雅礼集训 2017 Day2」线段游戏

    分析 区间李超树板子题 代码 #include<bits/stdc++.h> using namespace std; #define db double const int inf = ...

  10. 将ubuntu系统录到u盘上

    可以使用bootice工具对u盘分区,并隐藏,然后把系统录到隐藏分区,ubuntu只需要1.5G即可.bootice很强大 录制工具可选的有Universal USB Install.UltraISO ...