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 ...
随机推荐
- 关于APICloud读取不到虚拟机及数据库的问题
工具:apicloud编辑器 虚拟机:夜神虚拟机(nox_setup_v6.0.1.0_full)版本 数据库:Oracle 11G 以为夜神虚拟机版本太高,进程adb.exe读取不出虚拟机和数据库, ...
- TempData知多少
网上对TempData的总结为: 保存在session中,Controller每次执行请求时,会从session中一次获取所有tempdata数据,保存在单独的内部数据字典中,而后从session中清 ...
- HTML:Event [转]
这篇文章对于了解Javascript的事件处理机制非常好,将它全文转载于此,以备不时之需. 什么是事件? 事件(Event)是JavaScript应用跳动的心脏 ,也是把所有东西粘在一起的胶水.当我们 ...
- 《Java NIO (中文版)》【PDF】下载
<Java NIO (中文版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062530 NIO (中文版)>[PDF]& ...
- 小白的Python之路 day3 函数
1.函数基本语法及特性 背景提要 现在老板让你写一个监控程序,监控服务器的系统状况,当cpu\memory\disk等指标的使用量超过阀值时即发邮件报警,你掏空了所有的知识量,写出了以下代码 1 2 ...
- 三菱Q系列PLC的智能功能模块程序
一.模拟量输入模块Q64AD 1.模块开关或者参数设置 1.1I/O分配 1.2开关设置使用通道1,0-5v, 1.3使用GX configurator设置自动刷新PLC设置智能功能模块参数,即将模拟 ...
- lumen安装后输出hello world
1.安装composer,具体请百度 2.composer 切换中国镜像,好处自己体会,命令如下 composer config -g repo.packagist composer https:// ...
- CentOS5 可用yum源
[base] name=CentOS-$releasever - Base #mirrorlist=http://mirrorlist.centos.org/?release=$releasever& ...
- sar 命令详解
sar (System Activity Reporter)命令是LInux下系统运行状态统计工具, 它将指定的操作系统状态计数器显示到标准输出设备. sar 工具将对系统当前的状态进行取样,然后通过 ...
- JavaScript及jQuery中的各种宽高属性图解
文/poetries(简书作者)原文链接:http://www.jianshu.com/p/60332df38393 著作权归作者所有,转载请联系作者获得授权, 并标注“简书作者”. 作者声明:本 ...