什么是备忘录模式?

  备忘录模式(Memento):在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

               这样以后就可将该对象恢复到原先保存的状态。 

备忘录模式的组成

   Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态。

            Originator可根据需要决定Memento存储Originator的哪些内部状态。

  Memento(备忘录):负责存储Originator对象的内部状态,并可防止Originator以外的其他对象访问Memento。

            Memento有两个接口,Caretaker只能看到备忘录的窄接口,它只能将备忘录传递给其他对象。

            Originator能够看到一个宽接口,允许它访问返回到现钱状态所需的所有数据。

  Caretaker(管理者):负责保存好备忘录Memento,不能对备忘录的内容进行操作或者检查。

备忘录模式具体实现

适配器模式的结构

  

适配器模式的实现

Originator(发起人)类:

     class Originator
{
private string state;
public string State
{
get { return state; }
set { state = value; }
}
public void Show()
{
Console.WriteLine("State={0}", State);
}
/// <summary>
/// 从memento中调用之前保存好的参数
/// </summary>
public void SetMemento(Memento memento)
{
this.state = memento.State;
}
/// <summary>
/// 将当前的参数记录到Memento中去
/// </summary>
/// <returns></returns>
public Memento CreateMemento()
{
return (new Memento(state));
}
}

Memento(备忘录)类:

         class Memento
{
private string state;
/// <summary>
/// 备忘录中只需要变成只读就可以了
/// </summary>
public string State
{
get { return state; }
}
public Memento(string state)
{
this.state = state;
}
}

Caretaker(管理者)类:

         class Caretaker
{
private Memento memento;
public Memento Memento
{
get { return memento; }
set { memento = value; }
}
}

主函数调用

         static void Main(string[] args)
{
//初始化Originator,设定初始数据
Originator o = new Originator();
o.State = "O";
o.Show();
//保存Originator传递至Memento中
Caretaker c = new Caretaker();
c.Memento = o.CreateMemento();
//修改Originator中的数据
o.State = "T";
o.Show();
//调用备忘录中数据,重新更新数据
o.SetMemento(c.Memento);
o.Show(); Console.Read();
}

实例解析

  为了深化理解,我们准备一个具体的实例来分析。

   在玩游戏的过程中,假设游戏有99关,我们从第1关开始,打到第15关的时候没有成功,这是我们就需要保存保存当前的进度,不然下次进来的时候我们就又得从第一关重新开始了。

分析:

  我们需要保存当前的进度,这只是起到一个暂存的作用。

  

具体实现:

     class Program
{
static void Main(string[] args)
{
//创建一个英雄角色李逍遥
GameRole lixiaoyao = new GameRole();
lixiaoyao.GetInitState();
lixiaoyao.Show();
//将李逍遥数据保存在备忘录中
RoleStateCaretaker c = new RoleStateCaretaker();
c.Menmento = lixiaoyao.SaveState();
//让李逍遥参与战斗
lixiaoyao.Fight();
lixiaoyao.Show();
//由于参与战斗后状态都发生了变化,所以重新调用以前的数据
lixiaoyao.RecoverState(c.Menmento);
lixiaoyao.Show(); Console.Read();
}
class GameRole
{
private int vitality;
private int attack;
private int defense;
//生命力
public int Vitality
{
get { return vitality; }
set { vitality = value; }
}
//攻击力
public int Attack
{
get { return attack; }
set { attack = value; }
}
//防御力
public int Defense
{
get { return defense; }
set { defense = value; }
}
//获取初始状态
public void GetInitState()
{
this.vitality = ;
this.defense = ;
this.attack = ;
}
//从Memento中获取到刚刚保存的数据
public void RecoverState(RoleStateMemento memento)
{
this.vitality = memento.Vitality;
this.defense = memento.Defense;
this.attack = memento.Attack;
}
//保存当前数据到Memento中
public RoleStateMemento SaveState()
{
return (new RoleStateMemento(vitality, attack, defense));
}
//显示当前状态
public void Show()
{
Console.WriteLine("State:");
Console.WriteLine("vitality={0}", vitality);
Console.WriteLine("Attack={0}", attack);
Console.WriteLine("Defense={0}", Defense);
}
//参与战队导致状态变得不好了
public void Fight()
{
this.vitality = ;
this.attack = ;
this.defense = ;
}
}
class RoleStateMemento
{
private int vitality;
private int attack;
private int defense;
//生命力
public int Vitality
{
get { return vitality; }
set { vitality = value; }
}
//攻击力
public int Attack
{
get { return attack; }
set { attack = value; }
}
//防御力
public int Defense
{
get { return defense; }
set { defense = value; }
}
//当角色将数据传递过来的时候需要调用这个函数
public RoleStateMemento(int v,int a,int d)
{
this.vitality = v;
this.defense = d;
this.attack = a;
}
}
class RoleStateCaretaker
{
private RoleStateMemento memento;
public RoleStateMemento Menmento
{
get { return memento; }
set { memento = value; }
}
}
}

备忘录模式的优缺点

  Memento模式比较适用于功能比较复杂的,但是需要维护或者记录属性历史的类,或者需要保存的属性只是众多属性中的一个小部分时。Originator可以根据保存的Memento信息还原到前一状态。

备注:文中所有代码及知识点均来自于《大话设计模式》,本人属于边学边看边敲代码边总结的阶段。

C#学习笔记-备忘录模式的更多相关文章

  1. 学习笔记——备忘录模式Memento

    备忘录模式,可以将当前状态保存,并随时恢复. Originator存在状态state,当需要保存此状态时,通过CreateMemento创建一个备忘录对象Memento保存此状态:而需要恢复相应状态时 ...

  2. 《Head first设计模式》学习笔记 – 迭代器模式

    <Head first设计模式>学习笔记 – 迭代器模式 代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 爆炸性新闻:对象村餐厅和对象村煎饼屋合并了!真是个 ...

  3. 设计模式学习笔记--备忘录(Mamento)模式

    写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方式,这就是软件模式:每个模式描写叙述了一个在我们程序设计中常常发生的问题,以及该问题的解决方式:当我们碰到模 ...

  4. Java设计模式学习记录-备忘录模式

    前言 这次要介绍的是备忘录模式,也是行为模式的一种 .现在人们的智能手机上都会有备忘录这样一个功能,大家也都会用,就是为了记住某件事情,防止以后自己忘记了.那么备忘录模式又是什么样子的呢?是不是和手机 ...

  5. 设计模式学习之备忘录模式(Memento,行为型模式)(19)

    假如我们已经记录一个人的个人信息,但是发现信息写错了,然后我先备份下再去修改,结果发现原来的信息是正确的,于是我就看备份的个人信息还原到初始的状态,下面我们用代码去实现 class Program { ...

  6. 设计模式 笔记 备忘录模式 Memento

    //---------------------------15/04/27---------------------------- //Memento 备忘录模式----对象行为型模式 /* 1:意图 ...

  7. 学习笔记——解释器模式Interpreter

    解释器模式,其实就是编译原理中的语法解释器,如果用在项目中,可以用于实现动态脚本的解析,也就是说项目可以支持用户脚本扩展. 但实际上,这种运行时解释,效率很慢,如果不是很需要的话,不建议使用. 一种简 ...

  8. [学习笔记] Dispose模式

    Dispose模式是.NET中很基础也很重要的一个模式,今天重新复习一下相关的东西并记录下来. 什么是Dispose模式? 什么时候我们该为一个类型实现Dispose模式 使用Dispose模式时应该 ...

  9. jquery学习笔记---插件开发模式和结构

    JQuery插件开发http://www.cnblogs.com/damonlan/archive/2012/04/06/2434460.html github教程:https://github.co ...

随机推荐

  1. 深入理解javascript函数进阶系列第四篇——惰性函数

    前面的话 惰性函数表示函数执行的分支只会在函数第一次调用的时候执行,在第一次调用过程中,该函数会被覆盖为另一个按照合适方式执行的函数,这样任何对原函数的调用就不用再经过执行的分支了.本文将详细介绍惰性 ...

  2. HBase shell 命令介绍

    HBase shell是HBase的一套命令行工具,类似传统数据中的sql概念,可以使用shell命令来查询HBase中数据的详细情况.安装完HBase之后,如果配置了HBase的环境变量,只要在sh ...

  3. 以List为例浅谈C#的学习方法

    前言:关于学习方法的讨论其实是个比较模糊的概念,对于List的介绍的资料其实已经很多了,但是一般是介绍List本身,我打算分享的是,以温故List为例,来获取新知识的这么一个过程.这里的新知识也不是什 ...

  4. Sphinx学习笔记2

    因为网站搜索的需要,启动了一个搜索引擎项目,其实也算不上完整的搜索引擎,需求很简单,如下:     1)搜索产品名.类别名.品牌名.副标题.关键字等字段     2)数据量目前为13000左右,未来可 ...

  5. Android studio导入eclipse项目(亲测)

    之前上网搜索的时候,网上都说先用eclipse导出gradle,之后再用Android Studio的import project导入,但是这个方法使用的过程中会出现许多错误,解决了一个又一个还是不得 ...

  6. Linux简介,虚拟机安装,网络设置,桌面和vim安装

    Linux简介: linux代表系统内核.Linux系统指基于Linux内核的操作系统,由内核和程序结合组成.比较流行的发行版本由RedHat Linux.Fedora.Centos.Debian.U ...

  7. iOS 应用中加载文档pdf/word/txt

    一.加载PDF文档:应用内打开文档.手机中其他应用打开文档 Demo 首先拖入一个文档pdf.word.txt,打开不同的文档知识 文件名字.类型修改即可 #import "ReadView ...

  8. JavaScript的setter与getter方法

    作者:http://hawkzz.com 以前在写项目过程一直都没有使用过Javascript的setter与getter方法,所以对其是一种要懂不懂的概念:今天看书看到这个知识点,还是模模糊糊的,于 ...

  9. [Mean of range in array]

    Given an array of n integers and q queries. Write a program to print floor value of mean in range l  ...

  10. php-redis 操作类 封装

    <?php /** * redis操作类 * 说明,任何为false的串,存在redis中都是空串. * 只有在key不存在时,才会返回false. * 这点可用于防止缓存穿透 * */ cla ...