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 ...
随机推荐
- 【quickhybrid】API规划
前言 当一切就绪后,就要开始进行API规划,这一块是整个Hybrid框架中非常重要的内容,毕竟对于前端页面来说,只会通过JS API来调用功能. 基本上,API调用起来是否方便简洁影响着整个体验. 这 ...
- 分布式:ACID, CAP, BASE
本文主要讲述分布式系统开发的一些相关理论基础. 一.ACID ACID是一系列对系统中数据进行访问与更新的操作所组成的一个程序执行的逻辑单元,狭义上的事务特指数据库事务. 1.Atomic原子性 事务 ...
- redis设置开机启动
方式一 1.设置redis.conf中daemonize为yes,确保守护进程开启,也就是在后台可以运行.(设置为yes后,启动时好像没有redis的启动界面,不知道为什么) #vi编辑redis安装 ...
- 33 款主宰 2017 iOS 开发的开源库
推荐一篇文章 改文章汇聚了现在主流的一些三方框架,很值得一看 https://mp.weixin.qq.com/s/ICodliohtzbmA-eLKRFT-Q
- iOS 让图片变模糊
#import <Accelerate/Accelerate.h> 1.初始化图片 UIImageView *iv = [[UIImageView alloc]initWithFrame: ...
- 常用的 JS 排序算法整理
关于排序算法的问题可以在网上搜到一大堆,但是纯 JS 版比较零散,之前面试的时候特意整理了一遍,附带排序效率比较. //1.冒泡排序 var bubbleSort = function(arr) { ...
- 测试xss
<script>window.onload=function(){ alert('加载完毕');}</script>
- tcpdump 命令详解
TCPdump: dump traffic on a network ,根据使用者的定义对网络上的数据包进行截获的一种包分析工具. TCPdump 可以讲网络中传送的数据包的 头信息完全截获下来提供 ...
- python (5分钟实现一个游戏的屏蔽敏感字系统,)
import datetime time=datetime.datetime.now() dirty= ['fuck','狗日的','犊子','麻批','仙人板板','R你妈','操你','草你',' ...
- JavaScript的DOM编程--02--获取元素节点
如何来获取元素节点: 1) .document.getElementById: 根据 id 属性获取对应的单个节点 2) .document.getElementsByTagName: 根据标签名获取 ...