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)的更多相关文章

  1. php 23种设计模式 - 备忘录模式

    备忘录模式 备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象.备忘录模式属于行为型模式. 介绍 意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该 ...

  2. 23种设计模式 - 状态变化(Memento备忘录 - State)

    其他设计模式 23种设计模式(C++) 每一种都有对应理解的相关代码示例 → Git原码 ⌨ 状态变化 在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的 ...

  3. [工作中的设计模式]备忘录模式memento

    一.模式解析 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象.备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住,并外部化,存储起来,从而可以在将来合适的时候把 ...

  4. php 23种设计模式 - 解释器模式

    给定一个语言, 定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子.角色:环境角色(PlayContent):定义解释规则的全局信息.抽象解释器(Empress):定义了部 ...

  5. php 23种设计模式 - 命令模式

    命令模式 将一个请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化.对请求排队或记录请求日志,以及支持撤销的操作. 命令模式以松散耦合主题为基础,发送消息.命令和请求,或通过一组处理程序发送 ...

  6. php 23种设计模式 - 迭代器模式

    迭代器模式 迭代器模式 (Iterator),又叫做游标(Cursor)模式.提供一种方法访问一个容器(Container)对象中各个元素,而又不需暴露该对象的内部细节. 当你需要访问一个聚合对象,而 ...

  7. 【Unity与23种设计模式】解释器模式(Interpreter)

    GoF中定义: "定义一个程序设计语言所需要的语句,并提供解释来解析(执行)该语言." 传统上,执行程序代码通常通过两种方式 第一种:编译程序 第二种:解释器 常见的使用解释器的程 ...

  8. 【Unity与23种设计模式】原型模式(Prototype)

    GoF中定义: "使用原型对象来产生指定类的对象,所以产生对象时,是使用复制原型对象来完成." Unity中 开发者可以组装游戏对象 它可以包括复杂的组件 组装好了之后,就可以将其 ...

  9. 【Unity与23种设计模式】命令模式(Command)

    GoF中定义: "将请求封装成为对象,让你可以将客户端的不同请求参数化,并配合队列.记录.复原等方法来执行请求的操作." 实现命令模式的标准在于: 当请求被对象化后,对于请求对象是 ...

随机推荐

  1. windows转mac-开发环境搭建(一):需要搭建的环境及安装的工具

    作为一个java后端开发者来说,随着项目的增加,前段时间用windows真是受尽折磨,电脑卡到不行,在我们开发部技术大佬的一再安利之下,狠下心选了个17年13寸带touch bar的MacBook P ...

  2. vector动态数组

    vector是STL模板库中的序列式容器,利用它可以有效地避免空间的浪费. 创建vector容器 vector< int >v:vector< char >:vector< ...

  3. UVA-11882 bfs + dfs + 剪枝

    假设当前已经到达(x,y),用bfs判断一下还可以到达的点有maxd个,如果maxd加上当前已经经过的长度小于当前答案的长度就退出,如果相同,就将bfs搜索到的点从大到小排序,如果连最大序列都无法大于 ...

  4. SyntaxError: Missing parentheses in call to 'print'

    C:\Users\konglb>python Python 3.6.3 (v3.6.3:2c5fed8, Oct  3 2017, 17:26:49) [MSC v.1900 32 bit (I ...

  5. 为你的APK进行数字签名

    摘要: 我们需要为 APK进行数字签名,这样才能发布到 Google Play商店.解决方法很简单,使用 Java的keytool命令创建证书并在 Gradle构建文件的 signingConfigs ...

  6. NLP︱句子级、词语级以及句子-词语之间相似性(相关名称:文档特征、词特征、词权重)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 关于相似性以及文档特征.词特征有太多种说法.弄 ...

  7. GOF 23种设计模式

    设计模式目录 创建型 1. Factory Method(工厂方法) 2. Abstract Factory(抽象工厂) 3. Builder(建造者) 4. Prototype(原型) 5. Sin ...

  8. FusionCharts封装-Category

    Categories.java: /** * @Title:Categories.java * @Package:com.fusionchart.model * @Description:Fusion ...

  9. eclipse报错

    1.eclipse报错具体如下 Error occurred during the build. Errors running builder 'JavaScript Validator' on pr ...

  10. IBM Rational AppScan:跨站点脚本攻击深入解析

    IBM Rational AppScan:跨站点脚本攻击深入解析    了解黑客如何启动跨站点脚本攻击(cross-site scripting,XSS),该攻击危害(及不危害)什么,如何检测它们,以 ...