【Unity与23种设计模式】备忘录模式(Memento)
GoF中定义:
“在不违反封装的原则下,获取一个对象的内部状态并保留在外部,让对象可以在日后恢复到原先保留时的状态。”
对于一些需要存储的数据,比如历史最高分
当与得分减分系统写入一个类时,违反了单一职责原则
最好是做一个SaveData的类单独存储或获取
而当使用一个单独的类时,又必须将数据public向外公开
这就将游戏置于危险的境地,甚至是方便了外挂横行
针对此矛盾局势
备忘录模式便解决了这一问题
备忘录模式可以描述为:
在不增加各个游戏系统类成员的“存取”方法的前提之下
存盘功能要能够获取各个游戏系统内部需要保存的信息
然后再游戏重新开始时,再将记录读取,并重新设置给各个游戏系统
备忘录模式的原理是:
游戏系统提供存取内部成员的方法,是让游戏系统处于“被动”状态
备忘录模式则是将游戏系统由“被动”改为“主动”提供
意思是让游戏系统自己决定要提供什么信息和记录存盘功能
也由游戏系统决定要从存盘功能中,读取什么样的数据及记录还原给内部成员
//需要存储的内容信息
public class Originator {
string m_State;//需要被保存的状态 public void SetInfo(string State) {
m_State = State;
} public void ShowInfo() {
Debug.Log("Originator State:" + m_State);
} public Memento CreateMemento() {
Memento newMemento = new Memento();
newMemento.SetState(m_State);
return newMemento;
} public void SetMemento(Memento m) {
m_State = m.GetState();
}
}
//存放Originator对象的内部状态
public class Memento {
string m_State; public string GetState() {
return m_State;
} public void SetState(string State) {
m_State = State;
}
}
//测试类
public class TestMemento {
void UnitTest() {
Originator theOriginator = new Originator(); theOriginator.SetInfo("Step1");
theOriginator.ShowInfo(); Memento theMemento = theOriginator.CreateMemento(); theOriginator.SetInfo("Step2");
theOriginator.ShowInfo(); theOriginator.SetMemento(theMemento);
theOriginator.ShowInfo();
}
}
//Originator State:Info:Step1
//Originator State:Info:Step2
//Originator State:Info:Step1
文章整理自书籍《设计模式与游戏完美开发》 菜升达 著
【Unity与23种设计模式】备忘录模式(Memento)的更多相关文章
- php 23种设计模式 - 备忘录模式
备忘录模式 备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象.备忘录模式属于行为型模式. 介绍 意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该 ...
- 23种设计模式 - 状态变化(Memento备忘录 - State)
其他设计模式 23种设计模式(C++) 每一种都有对应理解的相关代码示例 → Git原码 ⌨ 状态变化 在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的 ...
- [工作中的设计模式]备忘录模式memento
一.模式解析 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象.备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住,并外部化,存储起来,从而可以在将来合适的时候把 ...
- php 23种设计模式 - 解释器模式
给定一个语言, 定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子.角色:环境角色(PlayContent):定义解释规则的全局信息.抽象解释器(Empress):定义了部 ...
- php 23种设计模式 - 命令模式
命令模式 将一个请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化.对请求排队或记录请求日志,以及支持撤销的操作. 命令模式以松散耦合主题为基础,发送消息.命令和请求,或通过一组处理程序发送 ...
- php 23种设计模式 - 迭代器模式
迭代器模式 迭代器模式 (Iterator),又叫做游标(Cursor)模式.提供一种方法访问一个容器(Container)对象中各个元素,而又不需暴露该对象的内部细节. 当你需要访问一个聚合对象,而 ...
- 【Unity与23种设计模式】解释器模式(Interpreter)
GoF中定义: "定义一个程序设计语言所需要的语句,并提供解释来解析(执行)该语言." 传统上,执行程序代码通常通过两种方式 第一种:编译程序 第二种:解释器 常见的使用解释器的程 ...
- 【Unity与23种设计模式】原型模式(Prototype)
GoF中定义: "使用原型对象来产生指定类的对象,所以产生对象时,是使用复制原型对象来完成." Unity中 开发者可以组装游戏对象 它可以包括复杂的组件 组装好了之后,就可以将其 ...
- 【Unity与23种设计模式】命令模式(Command)
GoF中定义: "将请求封装成为对象,让你可以将客户端的不同请求参数化,并配合队列.记录.复原等方法来执行请求的操作." 实现命令模式的标准在于: 当请求被对象化后,对于请求对象是 ...
随机推荐
- PHP实现网页爬虫
抓取某一个网页中的内容,需要对DOM树进行解析,找到指定节点后,再抓取我们需要的内容,过程有点繁琐.LZ总结了几种常用的.易于实现的网页抓取方式,如果熟悉JQuery选择器,这几种框架会相当简单. 一 ...
- 2017第八届蓝桥杯 K倍区间
标题: k倍区间 给定一个长度为N的数列,A1, A2, - AN,如果其中一段连续的子序列Ai, Ai+1, - Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间. ...
- JQuery基础知识学习1
1.JQuery是javascript的类库 2.下载JQuery 3.导入JQuery <script src="jquery-3.0.0.js"></scri ...
- RISC_CPU
采用Top-Down设计方法,深入理解CPU的运作原理,本文参照夏宇闻老师的<Verilog 数字系统设计教程>,并做了相应的修改.仿真工具采用Mentor公司的ModelSim. 1.C ...
- java I/O框架 (四)文件流
文件读取 FileInputStream FileReader 文件写入 FileOutputStream FileWriter 随机文件读写 RandomAccessFile 一.文件读取 File ...
- 关于 target="_blank"漏洞的分析
创建: 于 八月 30, 2016 关于 target="_blank"漏洞的分析 一.漏洞详情:首先攻击者能够将链接(指向攻击者自己控制的页面的,该被控页面的js脚本可以对母页 ...
- 2.2 HOST主桥
本节以MPC8548处理器为例说明HOST主桥在PowerPC处理器中的实现机制,并简要介绍x86处理器系统使用的HOST主桥. MPC8548处理器是Freescale基于E500 V2内核的一个P ...
- Android shape使用详解
在android开发过程中,shape是比较常用的,用于设定控件的形状,可以在selector,layout等里面使用,有6个子标签,各属性说明如下: <?xml version="1 ...
- java Socket实现简单在线聊天(二)
接<java Socket实现简单在线聊天(一)>,在单客户端连接的基础上,这里第二步需要实现多客户端的连接,也就需要使用到线程.每当有一个新的客户端连接上来,服务端便需要新启动一个线程进 ...
- FusionCharts 3D帕累托图
1.设计3D帕累托图的页面 Pareto3D.html: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN&q ...