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 ...
随机推荐
- 从0开始做垂直O2O个性化推荐-以58到家美甲为例
从0开始做垂直O2O个性化推荐 上次以58转转为例,介绍了如何从0开始如何做互联网推荐产品(回复"推荐"阅读),58转转的宝贝为闲置物品,品类多种多样,要做统一的宝贝画像比较难,而 ...
- OS X Yosemite升级提示升级OS10.11或更高版本问题解决方法
如图,楼主的pro久未升级,版本号已经很低.某天一时兴起,想体验最新版本的OS X.就很开心的进行软件更新: 依据iOS上的APP.系统升级经验,这是一个非常自然.毫无难度的过程,哪知道,今天一直卡在 ...
- cs231n --- 3 : Convolutional Neural Networks (CNNs / ConvNets)
CNN介绍 与之前的神经网络不同之处在于,CNN明确指定了输入就是图像,这允许我们将某些特征编码到CNN的结构中去,不仅易于实现,还能极大减少网络的参数. 一. 结构概述 与一般的神经网络不同,卷积神 ...
- Python datatime 格式转换,插入MySQL数据库
Python datatime 格式转换,插入MySQL数据库 zoerywzhou@163.com http://www.cnblogs.com/swje/ 作者:Zhouwan 2017-11-2 ...
- svn搭建服务器--- 绝对好使---杜恩德
如何创建 SVN 服务器,并搭建自己的 SVN 仓库 听语音 | 浏览:1289 | 更新:2016-09-10 17:45 1 2 3 4 5 6 7 分步阅读 百度经验:jingyan.baidu ...
- NPOI:处理xls文件中的合并行
/// <summary> /// NPOI根据路径获取文件转换成DataTable /// </summary> /// <param name="FileP ...
- Lua 数组排序 table.sort的注意事项
1. table中不能有nil table.sort是排序函数,它要求要排序的目标table的必须是从1到n连续的,即中间不能有nil. 2. 重写的比较函数,两个值相等时不能return true ...
- iOS UITabView简写瀑布流
代码demo 一.tabViewCell,通过image的比例高算出cell 的高度 #import "TableViewCell.h" @implementation Table ...
- iOS通用链接(Universal Links)突然点击无效的解决方案
接上文<微信中通过页面(H5)直接打开本地app的解决方案>已经把iOS搞定并且已经正常能跑了,突然就再也用不了了... 问题描述 测试告诉我,如果从微信打开App之后,点击App右上角的 ...
- Swift学习第二天--面向对象
//: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...