备忘录(Memento)模式
*备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对戏的内部状态,
* 并在该对象之外保存这个状态。这样以后就能恢复到原来保存的状态
*Originator(发起人): 负责创建一个备忘录 Memento,用以记录当前时候他的内部状态,并可用于备忘录恢复。
*Memento(备忘录):负责存储Originator对象的内部状态,并可防止Originator以外的其他对象访问备忘录Memento。
*Caretaker(管理者):负责保存好备忘录。
基础代码如下:
Originator发起人类中需要提供 创建备忘录 跟 读取备忘录的方法。
Caretaker 还要提供一个存储的第3方类。用于暂存 备忘录。(管理者)
Originator o = new Originator();
o.State = "On";
o.Show(); Caretaker c = new Caretaker();
c.Memento = o.CreateMemento(); o.State = "Off";
o.Show(); o.SetMemento(c.Memento);
o.Show(); /// <summary>
/// 发起人
/// </summary>
public class Originator
{
public string State
{ get; set; }
public Memento CreateMemento()
{
return (new Memento(State));
}
public void SetMemento(Memento memento)
{
State = memento.State;
}
public void Show()
{
Console.WriteLine("State=" + State);
}
}
/// <summary>
/// Memento(备忘录)
/// </summary>
public class Memento
{
public string State
{ get; set; }
public Memento(string state)
{
this.State = state;
}
}
/// <summary>
/// Caretaker(管理者)
/// </summary>
public class Caretaker
{
public Memento Memento
{ get; set; }
}
实例
Console.WriteLine(" 数据初始化:");
GameWuZhunShen WuZhenShen = new GameWuZhunShen();
WuZhenShen.HP = "";
WuZhenShen.MP = "";
WuZhenShen.AP = "";
WuZhenShen.SP = "";
WuZhenShen.Show();
Console.WriteLine(" \n保存数据:(=========)");
GMCaretaker GM = new GMCaretaker();
GM.WuZhunShen = WuZhenShen.SaveState();
Console.WriteLine(" \n参战后数据:");
WuZhenShen.HP = "";
WuZhenShen.MP = "";
WuZhenShen.AP = "";
WuZhenShen.SP = "";
WuZhenShen.Show();
Console.WriteLine(" \n恢复数据:");
WuZhenShen.SetState(GM.WuZhunShen);
WuZhenShen.Show();
/// <summary>
/// 游戏角色 -- 武尊神
/// </summary>
public class GameWuZhunShen
{
//属性值
public string HP
{ get; set; }
public string MP
{ get; set; }
public string AP
{ get; set; }
public string SP
{ get; set; }
//保存数据
public WuZhunShenMemento SaveState()
{
return new WuZhunShenMemento(HP, MP, AP, SP);
}
//读取保存的数据
public void SetState(WuZhunShenMemento wuZhunShen)
{
HP = wuZhunShen.HP;
MP = wuZhunShen.MP;
AP = wuZhunShen.AP;
SP = wuZhunShen.SP;
}
public void Show()
{
Console.Write(" 武尊神:\n");
Console.Write(" HP:'{0}'\n", HP);
Console.Write(" MP:'{0}'\n", MP);
Console.Write(" AP:'{0}'\n", AP);
Console.Write(" SP:'{0}'\n", SP);
}
}
/// <summary>
/// 游戏角色备忘录
/// </summary>
public class WuZhunShenMemento
{
//属性值
public string HP
{ get; set; }
public string MP
{ get; set; }
public string AP
{ get; set; }
public string SP
{ get; set; }
public WuZhunShenMemento(string _HP, string _MP, string _AP, string _SP)
{
HP = _HP;
MP = _MP;
AP = _AP;
SP = _SP;
}
}
/// <summary>
/// 系统管理者
/// </summary>
public class GMCaretaker
{
public WuZhunShenMemento WuZhunShen
{ get; set; }
}
备忘录(Memento)模式的更多相关文章
- C++设计模式实现--备忘录(Memento)模式
一. 备忘录模式 定义:在不破坏封装性的前提下,捕获一个对象的内部状态.并在该对象之外保存这个状态. 这样以后就可将该对象恢复到原先保存的状态. 结构图: 使用范围: Memento 模式比較适用于功 ...
- 设计模式C++描述----17.备忘录(Memento)模式
一. 备忘录模式 定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 结构图: 使用范围: Memento 模式比较适用于功能 ...
- 备忘录(Memento)模式
备忘录模式又叫做快照模式或者Token模式. 备忘录对象是一个用来存储另一个对象内部状态的快照的对象.备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉住,并外部化,存储起来,从而可以在将来 ...
- Java设计模式之从[暗黑破坏神存档点]分析备忘录(Memento)模式
在大部分游戏中,都有一个"存档点"的概念.比如,在挑战boss前,游戏会在某个地方存档,假设玩家挑战boss失败,则会从这个存档点開始又一次游戏.因此,我们能够将这个"存 ...
- Memento 备忘录 快照模式
简介 定义: 在不破坏封装的前提下,捕获一个对象的[内部状态],并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态. 角色: 发起人Originator:要被备份的成员,它提供一创 ...
- Java设计模式(15)备忘录模式(Memento模式)
Memento定义:memento是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到原先保存的状态. Memento模式相对也比较好理解,我们看下列代码: public class ...
- Memento 备忘录 快照模式 MD
备忘录模式 简介 在不破坏封装的前提下,捕获一个对象的[内部状态],并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态. 角色: 发起人Originator:要被备份的成员,它提供 ...
- Memento模式(备忘录设计模式)
Memento模式? 使用面向对象编程的方式实现撤销功能时,需要事先保存实例的相关状态信息.然后,在撤销时,还需要根据所保存的信息将实例恢复至原来的状态.这个时候你需要使用Memento设计模式.(以 ...
- 【行为型】Memento模式
备忘录模式顾名思义就是一种能有备忘作用的设计模式,其目的是在对象外部保存其在某一时刻的状态信息,并且在任何需要的时候,都可以通过备忘录中保存的状态数据恢复对象在当时情形下的状态. 备忘录模式旨在对象的 ...
- memento模式
参考资料 • 维基百科:https://en.wikipedia.org/wiki/Memento_pattern • 百度百科:http://baike.baidu.com/link?url=ZQZ ...
随机推荐
- POJ3020(最小边覆盖)
Antenna Placement Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8924 Accepted: 4428 ...
- Vue.js:教程
ylbtech-Vue.js:教程 1.返回顶部 1. Vue.js 教程 Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的渐进式框架. Vue 只关注视图层, 采用自底向 ...
- php中mb_strlen,mb_substr根据中文长度截取字符串
大于8截取,小于等于则不截取. 结合thinkphp模板引擎规则,代码如下: <,,'utf-8'}..<else/>{sh:$vo.name}</if> 这里if中的函 ...
- Playbooks 中的错误处理
Topics Playbooks 中的错误处理 忽略错误的命令 控制对失败的定义 覆写更改结果 Ansible 通常默认会确保检测模块和命令的返回码并且会快速失败 – 专注于一个错误除非你另作打算. ...
- apache 不解析 php
apache 不解析php 1.找到: AddType application/x-gzip .gz .tgz在其下面添加: AddType application/x-httpd-php .php ...
- ubuntu16.04 双网卡绑定
ubuntu 16.04 双网卡绑定仅仅需要配置/etc/network/interfaces 添加标记内容即可 apt-get install ifenslave 默认已经安装
- kettle init oracle jdbc
- leetcode788
public class Solution { public int RotatedDigits(int N) { ; ; i <= N; i++) { var str = i.ToString ...
- 12-EasyNetQ之消息版本控制
为了能够支持消息版本控制,你需要确保这个必要的组件已配置.最简单的实现是这样的: var bus = RabbitHutch.CreateBus("host=localhost", ...
- c语言语法目录一
1.#include<stdio.h> include 是要告诉编译器,包含一个头文件 在c语言中,任何库函数调用都需要提前包含头文件 <头文件> 代表让c语言编译器去系统目录 ...