版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Design Patterns,备忘录模式,10103415 唐林,大纲,备忘录模式概述 备忘录模式的结构与实现 备忘录模式的应用实例 实现多次撤销 备忘录模式的优缺点与适用环境,备忘录模式概述,备忘录模式软件中的“后悔药”撤销(Undo),备忘录模式概述,分析 通过使用备忘录模式可以让系统恢复到某一特定的历史状态 首先保存软件系统的历史状态,当用户需要取消错误操作并且返回到某个历史状态时,可以取出事先保存的历史状态来覆盖当前状态,备忘录模式概述,备忘录模式的定义 对象行为型模式,备忘录模式概述,备忘录模式的定义 别名为标记(Token)模式 提供了一种状态恢复的实现机制,使得用户可以方便地回
2、到一个特定的历史步骤 当前在很多软件所提供的撤销(Undo)操作中就使用了备忘录模式,备忘录模式的结构与实现,备忘录模式的结构,备忘录模式的结构与实现,备忘录模式的结构 备忘录模式包含以下3个角色: Originator(原发器) Memento(备忘录) Caretaker(负责人),备忘录模式的结构与实现,备忘录模式的实现 典型的原发器类代码:,备忘录模式的结构与实现,备忘录模式的实现 典型的备忘录类代码:,备忘录模式的结构与实现,备忘录模式的实现 除了Originator类,不允许其他类来调用备忘录类Memento的构造函数与相关方法 如果允许其他类调用SetState()等方法,将导致
3、在备忘录中保存的历史状态发生改变,通过撤销操作所恢复的状态就不再是真实的历史状态,备忘录模式也就失去了本身的意义 理想的情况是只允许生成该备忘录的原发器访问备忘录的内部状态,备忘录模式的结构与实现,备忘录模式的实现 Java语言实现: 将Memento类与Originator类定义在同一个包(package)中来实现封装,使用默认访问标识符来定义Memento类,即保证其在包内可见 将备忘录类作为原发器类的内部类,使得只有原发器才可以访问备忘录中的数据,其他对象都无法使用备忘录中的数据,备忘录模式的结构与实现,备忘录模式的实现 典型的负责人类代码:,备忘录模式的结构与实现,备忘录模式的实现 客
4、户端演示代码:,备忘录模式的应用实例,实例一,备忘录模式的应用实例,实例类图,中国象棋棋子撤销功能结构图,实例代码 (1) Chessman:象棋棋子类,充当原发器,实例代码 (2) ChessmanMemento:象棋棋子备忘录类,充当备忘录,实例代码 (3) MementoCaretaker:象棋棋子备忘录管理类,充当负责人,实例代码 (4) Program:客户端测试类,实例代码 (5) 编译并运行程序,结果如下:,备忘录模式的应用实例,结果及分析 通过创建备忘录对象可以将象棋棋子的历史状态信息记录下来,在“悔棋”时取出存储在备忘录中的历史状态信息,用历史状态来覆盖当前状态,从而实现状态
5、的撤销,实现多次撤销,动机 有时候用户需要撤销多步操作 实现方案:在负责人类中定义一个集合来存储多个备忘录,每个备忘录负责保存一个历史状态,在撤销时可以对备忘录集合进行逆向遍历,回到一个指定的历史状态,还可以对备忘录集合进行正向遍历,实现重做(Redo)或恢复操作,即取消撤销,让对象状态得到恢复,实现多次撤销,结构,改进之后的中国象棋棋子撤销功能结构图,实现多次撤销,修改MementoCaretaker类,实现多次撤销,客户端测试代码,实现多次撤销,客户端测试代码,实现多次撤销,运行结果,实现多次撤销,扩展,本实例只能实现最简单的Undo和Redo操作,并未考虑对象状态在操作过程中出现分支的情
6、况。如果在撤销到某个历史状态之后,用户再修改对象状态,此后执行Undo操作时可能会发生对象状态错误,大家可以思考其产生原因。【注:可将对象状态的改变绘制成一张树状图进行分析。】 在实际开发中,可以使用链表或者堆栈来处理有分支的对象状态改变,大家可通过链表或者堆栈对上述实例进行改进。,备忘录模式的应用实例,实例二,备忘录模式的应用实例,备忘录模式的应用实例,备忘录模式的应用实例,备忘录模式的应用实例,备忘录模式的应用实例,保存游戏进度 游戏角色、生命力、攻击力、防御力 模拟战斗代码,读取游戏进度,备忘录模式的应用实例,class GameRole /生命力 private int vit; pu
7、blic int Vitality get return vit; set vit = value; /攻击力 private int atk; public int Attack get return atk; set atk = value; /防御力 private int def; public int Defense get return def; set def = value; ,/状态显示 public void StateDisplay() Console.WriteLine(角色当前状态:); Console.WriteLine(体力:0, this.vit); Conso
8、le.WriteLine(攻击力:0, this.atk); Console.WriteLine(防御力:0, this.def); Console.WriteLine(); /获得初始状态 public void GetInitState() this.vit = 100; this.atk = 100; this.def = 100; /战斗 public void Fight() this.vit = 0; this.atk = 0; this.def = 0; ,不使用备忘录模式的代码,备忘录模式的应用实例,static void Main(string args) /大战Boss前
9、GameRole lixiaoyao = new GameRole(); lixiaoyao.GetInitState(); lixiaoyao.StateDisplay(); /保存进度 GameRole backup = new GameRole(); backup.Vitality = lixiaoyao.Vitality; backup.Attack = lixiaoyao.Attack; backup.Defense = lixiaoyao.Defense; /大战Boss时,损耗严重 lixiaoyao.Fight(); lixiaoyao.StateDisplay(); /恢复之
10、前状态 lixiaoyao.Vitality = backup.Vitality; lixiaoyao.Attack = backup.Attack; lixiaoyao.Defense = backup.Defense; lixiaoyao.StateDisplay(); Console.Read(); ,不使用备忘录模式的代码,备忘录模式的应用实例,使用备忘录模式的类图,备忘录模式的应用实例,使用备忘录模式的代码,class GameRole /保存角色状态 public RoleStateMemento SaveState() return (new RoleStateMemento(v
11、it, atk, def); /恢复角色状态 public void RecoveryState(RoleStateMemento memento) this.vit = memento.Vitality; this.atk = memento.Attack; this.def = memento.Defense; ,/状态显示 public void StateDisplay() Console.WriteLine(角色当前状态:); Console.WriteLine(体力:0, this.vit); Console.WriteLine(攻击力:0, this.atk); Console.
12、WriteLine(防御力:0, this.def); Console.WriteLine(); /获得初始状态 public void GetInitState() this.vit = 100; this.atk = 100; this.def = 100; /战斗 public void Fight() this.vit = 0; this.atk = 0; this.def = 0; ,备忘录模式的应用实例,使用备忘录模式的代码,class RoleStateMemento /角色状态存储箱 private int vit; private int atk; private int d
13、ef; public RoleStateMemento(int vit, int atk, int def) this.vit = vit; this.atk = atk; this.def = def; public int Vitality /生命力 get return vit; set vit = value; public int Attack /攻击力 get return atk; set atk = value; public int Defense /防御力 get return def; set def = value; ,备忘录模式的应用实例,使用备忘录模式的代码,/角色
14、状态管理者 class RoleStateCaretaker private RoleStateMemento memento; public void ImportState(RoleStateMemento Record) memento = Record; public RoleStateMemento ExportState() return memento; ,备忘录模式的应用实例,使用备忘录模式的代码,static void Main(string args) /大战Boss前 GameRole lixiaoyao = new GameRole(); lixiaoyao.GetIn
15、itState(); lixiaoyao.StateDisplay(); /保存进度 RoleStateCaretaker stateAdmin = new RoleStateCaretaker(); stateAdmin.ImportState(lixiaoyao.SaveState(); /大战Boss时,损耗严重 lixiaoyao.Fight(); lixiaoyao.StateDisplay(); /恢复之前状态 lixiaoyao.RecoveryState(stateAdmin.ExportState(); lixiaoyao.StateDisplay(); Console.Read(); ,备忘录模式的优缺点与适用环境,模式优点 提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤 实现了对信息的封装,一个备忘录对象是一种原发器对象状态的表示,不会被其他代码所改动,备
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农村住宅交易协议模版
- 集中采购合同的跨国运输管理
- 摄影与设计服务合同样本
- 商家承诺天猫保证书
- 解除劳动合同协议书模板
- 房屋买卖合同担保人权益如何维护
- 物业保洁协议格式
- 建筑基坑挖掘分包合同范本
- 教师与学校之间的聘用协议
- 云端服务终止方案合同
- 从理论到实践:2024年ESD防护培训课程详解
- 2024-2030年中国洁具行业发展趋势及竞争力策略分析报告
- 2024年时政热点知识竞赛试卷及答案(共三套)
- 2024年新疆(兵团)公务员考试《行测》真题及答案解析
- 2024北京初三一模语文汇编:基础知识综合
- QCSG1204009-2015电力监控系统安全防护技术规范
- 2024年度-《医疗事故处理条例》解读
- 非暴力沟通(完整版)
- 四大文明古国PPT.ppt
- 管工初赛实操
- 四川成都特色小吃.ppt
评论
0/150
提交评论