备忘录模式顾秀坚123_第1页
备忘录模式顾秀坚123_第2页
备忘录模式顾秀坚123_第3页
备忘录模式顾秀坚123_第4页
备忘录模式顾秀坚123_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

备忘录模式顾秀坚目录定义涉及角色模式分析实例与解析模式的优缺点模式应用本章小结定义备忘录模式(MementoPattern)又叫做快照模式(SnapshotPattern)或Token模式,是GoF的23种设计模式之一,属于行为模式。在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。涉及角色1.Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态。Originator可以根据需要决定Memento存储自己的哪些内部状态。2.Memento(备忘录):负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录。备忘录有两个接口:Caretaker只能看到备忘录的窄接口,他只能将备忘录传递给其他对象。Originator却可看到备忘录的宽接口,允许它访问返回到先前状态所需要的所有数据。3.Caretaker(管理者):负责备忘录Memento,不能对Memento的内容进行访问或者操作。涉及角色模式分析由于在备忘录中存储的是原发器的中间状态,因此需要防止原发器以外的其他对象访问备忘录。备忘录对象通常封装了原发器的部分或所有的状态信息,而且这些状态不能被其他对象访问,也就是说不能在备忘录对象之外保存原发器状态,因为暴露其内部状态将违反封装的原则,可能有损系统的可靠性和可扩展性。模式分析为了实现对备忘录对象的封装,需要对备忘录的调用进行控制:对于原发器而言,它可以调用备忘录的所有信息,允许原发器访问返回到先前状态所需的所有数据;对于负责人而言,只负责备忘录的保存并将备忘录传递给其他对象;对于其他对象而言,只需要从负责人处取出备忘录对象并将原发器对象的状态恢复,而无须关心备忘录的保存细节。理想的情况是只允许生成该备忘录的那个原发器访问备忘录的内部状态。实例与解析发起人角色源代码publicclassOriginator{privateList<String>states;privateintindex;publicOriginator(){states=newArrayList<String>();index=0;}publicMementocreateMemento(){returnnewMemento(states,index);}publicvoidrestoreMemento(Mementomemento){states=memento.getStates();

案例与分析

index=memento.getIndex();}publicvoidsetState(Stringstate){states.add(state);index++;}publicvoidprintStates(){

for(Stringstate:states){System.out.println(state);}}}案例与分析备忘录角色类publicclassMemento{privateList<String>states;privateintindex;publicMemento(List<String>states,intindex){this.states=newArrayList<String>(states);this.index=index;}publicList<String>getStates(){returnstates;}publicintgetIndex(){returnindex;}}案例与分析负责人角色类publicclassCaretaker{privateOriginatoro;privateList<Memento>mementos=newArrayList<Memento>();privateintcurrent;publicCaretaker(Originatoro){this.o=o;current=0;}publicintcreateMemento(){Mementomemento=o.createMemento();案例与分析

mementos.add(memento);returncurrent++;}publicvoidrestoreMemento(intindex){Mementomemento=mementos.get(index);o.restoreMemento(memento);}publicvoidremoveMemento(intindex){mementos.remove(index);}}案例与分析客户端角色源代码publicclassClient{publicstaticvoidmain(String[]args){Originatoro=newOriginator();Caretakerc=newCaretaker(o);o.setState("state0");c.createMemento();o.setState("state1");c.createMemento();o.setState("state2");

案例与分析

c.createMemento();o.setState("state3");c.createMemento();o.printStates();System.out.println("-----------------恢复检查点-----------------");c.restoreMemento(2);o.printStates();}}案例与分析运行结果模式的优缺点备忘录模式的优点1、有时一些发起人对象的内部信息必须保存在发起人对象以外的地方,但是必须要由发起人对象自己读取,这时,使用备忘录模式可以把复杂的发起人内部信息对其他的对象屏蔽起来,从而可以恰当地保持封装的边界。2、本模式简化了发起人类。发起人不再需要管理和保存其内部状态的一个个版本,客户端可以自行管理他们所需要的这些状态的版本。3、当发起人角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原。模式的优缺点备忘录模式的缺点1、如果发起人角色的状态需要完整地存储到备忘录对象中,那么在资源消耗上面备忘录对象会很昂贵。2、当负责人角色将一个备忘录存储起来的时候,负责人可能并不知道这个状态会占用多大的存储空间,从而无法提醒用户一个操作是否很昂贵。3、当发起人角色的状态改变的时候,有可能这个协议无效。如果状态改变的成功率不高的话,不如采取“假如”协议模式。模式应用几乎所有的文字或者图像编辑软件都提供了撤销(Ctrl+Z)的功能,即撤销操作,但是当软件关闭再打开时不能再进行撤销操作,也就是说不能再回到关闭软件前的状态,实际上这中间就使用到了备忘录模式,在编辑文件的同时可以保存一些内部状态,这些状态在软件关闭时从内存销毁,当然这些状态的保存也不是无限的,很多软件只提供有限次的撤销操作。数据库管理系统DBMS所提供的事务管理应用了备忘录模式,当数据库某事务中一条数据操作语句执行失败时,整个事务将进行回滚操作,系统回到事务执行之前的状态。本章小结备忘录对象通常封装了原发器的部分或所有的状态信息,而且这些状态不能被其他对象访问,也就是说不能在该对象之外保存其状态,因为暴露其内部状态将违反封装的原则,可能有损系统的可靠性和可扩展性。备忘录模式的主要优点在于它提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,还简化了原发器对象,备忘录只保

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论