版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、www.ChinaSA.infoDesign Patterns备忘录模式*www.ChinaSA.info大纲备忘录模式概述备忘录模式的结构与实现备忘录模式的应用实例备忘录模式的优缺点与适用环境www.ChinaSA.info备忘录模式概述备忘录模式软件中的“后悔药”撤销(Undo)www.ChinaSA.info备忘录模式概述分析通过使用备忘录模式可以通过使用备忘录模式可以让系统让系统恢复到某一特定的历史状态恢复到某一特定的历史状态首先首先保存软件系统的历史状态保存软件系统的历史状态,当用户需要取消错误操作并且返当用户需要取消错误操作并且返回到某个历史状态时,可以回到某个历史状态时,可以取出
2、取出事先保存的历史状态来覆盖当前事先保存的历史状态来覆盖当前状态状态www.ChinaSA.info备忘录模式概述备忘录模式的定义对象行为型对象行为型模式模式备忘录模式备忘录模式:在不破坏封装的前提下在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样就可以在以后将对象恢复到原先保存的状态可以在以后将对象恢复到原先保存的状态。Memento Pattern: Without violating encapsulation, capture and externalize an objects internal state so that the object can
3、be restored to this state later.www.ChinaSA.info备忘录模式概述备忘录模式的定义别名为别名为标记标记(Token)模式模式提供了一种提供了一种状态恢复状态恢复的实现机制,使得用户可的实现机制,使得用户可以方便地以方便地回到一个特定的历史步骤回到一个特定的历史步骤当前在很多软件所提供的撤销(Undo)操作中就使用了备忘录模式www.ChinaSA.info备忘录模式的结构与实现备忘录模式的结构www.ChinaSA.info备忘录模式的结构与实现备忘录模式的结构备忘录模式包含以下备忘录模式包含以下3个角色:个角色:Originator(原发器)Mem
4、ento(备忘录)Caretaker(负责人)www.ChinaSA.info备忘录模式不同角色的作用原发器原发器:记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录数据。备忘录备忘录:负责存储原发器对象的内部状态,在需要的时候提供原发器需要的内部状态。负责人负责人:对备忘录进行管理,保存和提供备忘录。www.ChinaSA.info备忘录模式的结构与实现备忘录模式的实现典型的原发器类代码:典型的原发器类代码:原发器原发器 (Originator)namespace MementoSample public class Originator private strin
5、g state; public Originator(string state) this.state = state; / 创建一个备忘录对象创建一个备忘录对象 internal Memento CreateMemento() return new Memento(this); / 根据备忘录对象恢复原发器状态根据备忘录对象恢复原发器状态 internal void RestoreMemento(Memento m) state = m.GetState(); public void SetState(string state) this.state=state; public string
6、 GetState() return this.state; www.ChinaSA.info备忘录模式的结构与实现备忘录模式的实现典型的备忘录类代码:典型的备忘录类代码:namespace MementoSample /备忘录类,默认可见性,在程序集内可见备忘录类,默认可见性,在程序集内可见 internal class Memento private string state; internal Memento(Originator o) state = o.GetState(); internal void SetState(string state) this.state = stat
7、e; internal string GetState() return this.state; www.ChinaSA.info备忘录模式的结构与实现备忘录模式的实现除了除了Originator类,类,不允许其他类来调用备忘录类不允许其他类来调用备忘录类Memento的构造函数与相关方法的构造函数与相关方法如果允许其他类调用如果允许其他类调用SetState()等方法,将导致在备等方法,将导致在备忘录中保存的历史状态发生改变,通过撤销操作所恢忘录中保存的历史状态发生改变,通过撤销操作所恢复的状态就不再是真实的历史状态复的状态就不再是真实的历史状态,备忘录模式也就,备忘录模式也就失去了本身的意
8、义失去了本身的意义 理想的情况是理想的情况是只允许生成该备忘录的原发器访问备忘只允许生成该备忘录的原发器访问备忘录的内部状态录的内部状态www.ChinaSA.info备忘录模式的结构与实现备忘录模式的实现Java语言实现:语言实现:将Memento类与Originator类定义在同一个包(package)中来实现封装,使用默认访问标识符来定义Memento类,即保证其在包内可见将备忘录类作为原发器类的内部类,使得只有原发器才可以访问备忘录中的数据,其他对象都无法使用备忘录中的数据www.ChinaSA.info备忘录模式的结构与实现备忘录模式的实现 典型的负责人类代码:典型的负责人类代码:
9、负责人(负责人(Caretaker)namespace MementoSample public class Caretaker private Memento memento; internal Memento GetMemento() return memento; internal void SetMemento(Memento memento) this.memento = memento; www.ChinaSA.info备忘录模式的结构与实现备忘录模式的实现客户端演示代码:客户端演示代码:class Client public static void main(String arg
10、s) /创建原发器对象创建原发器对象 Originator ori = new Originator(状态状态(1); Console.WriteLine(ori.GetState(); /创建负责人对象,保存创建的备忘录对象创建负责人对象,保存创建的备忘录对象 Caretaker ct = new Caretaker(); ct.SetMemento(ori.CreateMemento(); ori.SetState(状态状态(2); Console.WriteLine(ori.GetState(); /从负责人对象中取出备忘录对象,实现撤销从负责人对象中取出备忘录对象,实现撤销 ori.R
11、estoreMemento(ct.GetMemento(); Console.WriteLine(ori.GetState(); Console.Read(); OnOffOnwww.ChinaSA.info备忘录模式的应用实例实例一在Android平台上运行的触摸式中国象棋软件,必须考虑用户的水平,经常不小心走错棋;还有些用户不习惯使用手指在手机屏幕上拖动棋子,常常出现操作失误,因此该中国象棋软件要提供“悔棋悔棋”功能,用户走错棋或操作失误后可恢复到前一个步骤。如下图所示: 中国象棋软件界面示意图中国象棋软件界面示意图为了实现“悔棋”功能,现使用备忘录模式来设计该中国象棋软件。www.Chi
12、naSA.info备忘录模式的应用实例w 结果及分析通过创建备忘录对象可以通过创建备忘录对象可以将象棋棋子的历史状态信息将象棋棋子的历史状态信息记录下来记录下来,在,在“悔棋悔棋”时取出存储在备忘录中的历史时取出存储在备忘录中的历史状态信息,状态信息,用历史状态来覆盖当前状态用历史状态来覆盖当前状态,从而实现状,从而实现状态的撤销态的撤销www.ChinaSA.info实现多次撤销动机有时候用户需要有时候用户需要撤销多步操作撤销多步操作实现方案:实现方案:在负责人类中在负责人类中定义一个集合定义一个集合来存储多个备来存储多个备忘录,每个备忘录负责保存一个历史状态,忘录,每个备忘录负责保存一个历
13、史状态,在撤销时在撤销时可以对备忘录集合进行逆向遍历,回到一个指定的历可以对备忘录集合进行逆向遍历,回到一个指定的历史状态史状态,还可以,还可以对备忘录集合进行正向遍历,实现重对备忘录集合进行正向遍历,实现重做做(Redo)或恢复操作或恢复操作,即取消撤销,让对象状态得到,即取消撤销,让对象状态得到恢复恢复www.ChinaSA.info实现多次撤销扩展 本实例只能实现最简单的本实例只能实现最简单的Undo和和Redo操作,并未操作,并未考虑对象状态在操作过程中出现分支的情况。如果在撤销考虑对象状态在操作过程中出现分支的情况。如果在撤销到某个历史状态之后,用户再修改对象状态,此后执行到某个历史
14、状态之后,用户再修改对象状态,此后执行Undo操作时可能会发生对象状态错误,大家可以思考其操作时可能会发生对象状态错误,大家可以思考其产生原因。产生原因。【注:可将对象状态的改变绘制成一张树状图注:可将对象状态的改变绘制成一张树状图进行分析。进行分析。】 在实际开发中,可以使用链表或者堆栈来处理有分支在实际开发中,可以使用链表或者堆栈来处理有分支的对象状态改变,大家可通过链表或者堆栈对上述实例进的对象状态改变,大家可通过链表或者堆栈对上述实例进行改进。行改进。www.ChinaSA.info备忘录模式的优缺点与适用环境模式优点提供了一种状态恢复的实现机制提供了一种状态恢复的实现机制,使得用,使得用户可以方便地回到一个特定的历史步骤户可以方便地回到一个特定的历史步骤实现了对信息的封装实现了对信息的封装,一个备忘录对象是,一个备忘录对象是一种原发器对象状态的表示,不会被其他一种原发器对象状态的表示,不会被其他代码所改动代码所改动www.ChinaSA.info备忘录模式的优缺点与适用环境模式缺点资源消耗过大资源消耗过大,如果需要保存的原发器类的,如果需要保存的原发器类的成员变量太多,就不可避免地需要占用大量成员变量太多,就不可避免地需要占用大量的存储空间,的存储空间,每保存一次对象的状态都需要每保存一次对象的状态都需要消耗一定的系统资源消耗一
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 车辆玻璃订购协议
- 还建房屋买卖合同的补充协议
- 违章行为自白书
- 速递物流合同
- 配电箱购销合同的信用证融资
- 酒类采购合同示例
- 重建信誉我向同学保证
- 钢筋工分包合同条款范例
- 铁粉购销协议样本
- 银行短期借款协议
- 2024版国开电大法学本科《国际法》历年期末考试试题及答案汇编
- 构建复合型高技能人才培养“岗课赛证”融通评价体系研究
- 空乘大学生职业生涯规划
- T-NAHIEM 96-2023 静脉用药调配中心建设与配置标准
- 儿童心肺复苏理论知识考核试题及答案
- 细菌性角膜溃疡的护理查房
- 个人简历电子版表格下载
- 200个句子涵盖了高考英语3500词汇(诵读加记忆)
- 婴幼儿托育服务与管理的职业生涯规划职业目标自我分析职业定位实施计划
- 半导体智能制造与工厂自动化
- 设备的前后期管理与改造
评论
0/150
提交评论