C#学习笔记-备忘录模式
什么是备忘录模式?
备忘录模式(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#学习笔记-备忘录模式的更多相关文章
- 学习笔记——备忘录模式Memento
备忘录模式,可以将当前状态保存,并随时恢复. Originator存在状态state,当需要保存此状态时,通过CreateMemento创建一个备忘录对象Memento保存此状态:而需要恢复相应状态时 ...
- 《Head first设计模式》学习笔记 – 迭代器模式
<Head first设计模式>学习笔记 – 迭代器模式 代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 爆炸性新闻:对象村餐厅和对象村煎饼屋合并了!真是个 ...
- 设计模式学习笔记--备忘录(Mamento)模式
写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方式,这就是软件模式:每个模式描写叙述了一个在我们程序设计中常常发生的问题,以及该问题的解决方式:当我们碰到模 ...
- Java设计模式学习记录-备忘录模式
前言 这次要介绍的是备忘录模式,也是行为模式的一种 .现在人们的智能手机上都会有备忘录这样一个功能,大家也都会用,就是为了记住某件事情,防止以后自己忘记了.那么备忘录模式又是什么样子的呢?是不是和手机 ...
- 设计模式学习之备忘录模式(Memento,行为型模式)(19)
假如我们已经记录一个人的个人信息,但是发现信息写错了,然后我先备份下再去修改,结果发现原来的信息是正确的,于是我就看备份的个人信息还原到初始的状态,下面我们用代码去实现 class Program { ...
- 设计模式 笔记 备忘录模式 Memento
//---------------------------15/04/27---------------------------- //Memento 备忘录模式----对象行为型模式 /* 1:意图 ...
- 学习笔记——解释器模式Interpreter
解释器模式,其实就是编译原理中的语法解释器,如果用在项目中,可以用于实现动态脚本的解析,也就是说项目可以支持用户脚本扩展. 但实际上,这种运行时解释,效率很慢,如果不是很需要的话,不建议使用. 一种简 ...
- [学习笔记] Dispose模式
Dispose模式是.NET中很基础也很重要的一个模式,今天重新复习一下相关的东西并记录下来. 什么是Dispose模式? 什么时候我们该为一个类型实现Dispose模式 使用Dispose模式时应该 ...
- jquery学习笔记---插件开发模式和结构
JQuery插件开发http://www.cnblogs.com/damonlan/archive/2012/04/06/2434460.html github教程:https://github.co ...
随机推荐
- C#开发微信门户及应用(48) - 在微信框架中整合CacheManager 缓存框架
在我们的很多框架或者项目应用中,缓存在一定程度上可以提高程序的响应速度,以及减轻服务器的承载压力,因此在一些地方我们都考虑引入缓存模块,这篇随笔介绍使用开源缓存框架CacheManager来实现数据的 ...
- CS:APP3e 深入理解计算机系统_3e C Programming Lab实验
queue.h: /* * Code for basic C skills diagnostic. * Developed for courses 15-213/18-213/15-513 by R. ...
- spark-submit参数说明--on YARN
示例: spark-submit [--option value] <application jar> [application arguments] 参数名称 含义 --master M ...
- JavScript--表单提交
前台代码 <div > <div id="show">asdasdas</div> <form id="form"&g ...
- APP Store开发指南
App Store 审核指南 iOS App打包上架超详细流程 ---2017.03 苹果对开发者提交的应用的审核之严格是出了名的,了解苹果的审核标准对于开发者防止应用被拒有着十分重要的意义.几天前苹 ...
- 10本Java书籍推荐
1. <深入理解Java虚拟机>是近年来国内出版的唯一一本与Java虚拟机相关的专著,也是唯一一本同时从核心理论和实际运用这两个角度去探讨Java虚拟机的著作,不仅理论分析得透彻,而且书中 ...
- Ryz的鬼题
蚂蚁(ant)[题目描述] 小 R 种了一棵苹果树,这棵树上有 n 个节点(标号从 0 到 n-1),有 n-1 条树枝连接这 n 个节点,这 n 个节点相互连通.每条树枝的长度为 1. 苹果树 ...
- Chrome调试折腾记_(1)调试控制中心快捷键详解!!!
转载:http://blog.csdn.net/crper/article/details/48098625 大多浏览器的调试功能的启用快捷键都一致-按下F12;还是熟悉的味道; 或者直接 Ctrl ...
- Nginx 错误处理方法: bind() to 0.0.0.0:80 failed
Nginx 错误处理方法: bind() to 0.0.0.0:80 failed 今天启动window上的nginx总是报错 错误信息是bind() to 0.0.0.0:80 failed (10 ...
- js知识点记录
1.for...in:用于遍历数组或对象的属性. for(var prop in obj){console.log(obj[prop])}; 该循环遍历对于对象属性是无序的,可能是因为obj本来就是无 ...