备忘录设计模式_第1页
备忘录设计模式_第2页
备忘录设计模式_第3页
备忘录设计模式_第4页
备忘录设计模式_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1、备忘录设计模式备忘录模式是数据备份与恢复的所依赖的重要框架。本节用此框架演绎了廊桥遗梦中的感人的爱情故事。后续又揭露了数据库的备份与恢复原理。目的是通过生动的例子让大家领略到备忘录模式的风采。把它真正地引入到我们的代码中来。1 在廊桥遗梦中,弗朗西丝深爱着罗伯特,但弗朗西丝有家庭,为了责任,她选择了把爱放在心底。在家里,弗朗西丝要爱丈夫,爱孩子,但这种亲情的爱,却不能埋没他对情人罗伯特刻骨的真爱。这种有新情不忘旧情的境界可以用备忘录模式表现出来。下面请看类图:先讲个爱情故事2 从类图上看出弗朗西丝在面对丈夫和孩子的时候要把自己对罗伯特的爱情隐藏起来。所以在Girl类状态属性用来表达弗朗西丝现在

2、的感情状态,是在想着家人的衣食住行还是在思念罗伯特。在弗朗西丝的感情中对罗伯特的爱是她整个思想的主线,只有在面对家人时,才把这份爱情放下(也就是把对罗伯特的爱备份起来),等到操劳完家务以后她又会重新想起罗伯特(恢复对罗伯特的思念)。在Girl类中有createMemento()和restoreMemento()正是记录弗朗西丝备份与恢复感情历程的函数。那么Memento类是干嘛的那?从Girl类中createMemento()和restoreMemento()两个函数可以看出Memento类是用来备份弗朗西丝感情的。而Manger类正是管理这个感情备份的,他一个管家一样看护这这个备份,以免备份

3、泄露,对主人弗朗西丝造成不利的影响。从类图的角度演绎女主角的感情世界3 从类图上看出备忘录模式有三个重要角色: Girl:发起者角色,里面包含着状态属性 (state)。以及对状态备份(createMemento())、更改(changeState()、恢复(restoreMemento()等函数。 Memento:备忘录角色,它主要负责对状态进行备份,它被Girl(发起者角色)依赖,通过Girl类中的createMemento()和restoreMemento()函数实现对状态的备份和恢复。 Manger:管理角色是对备份的管理角色。它与备份类形成聚合关系。使代码逻辑清晰,符合单一职责原则。

4、 代码:com.li.normal 审视备忘录模式的三个角色4需要保存和恢复数据相关状态场景;提供一个可回滚的操作;需要监控的副本场景中,例如要控制一个对象的属性,但监控又不应该作为系统的主要业务来调用,它只是边缘应用,即使是出现监控不准,对系统影响也不大,一般的做法是备份一个主线程的对象,然后由分析程序分析。数据库的事物管理就是用的备忘录模式使用场景5备忘录的生命周期,备忘录创建出来就是在“最近”代码中使用,要主动管理他的生命周期,建立就要使用,不使用就立即删除其引用,等待垃圾回收器对它的处理。备忘录的性能,不要在频繁建立备份的场景中使用备忘录模式(比如一个for循环中)原因有二:一是控制不

5、了建立备忘录的数量。二,大对象的建立是要消耗资源的,系统的性能需要考虑。因此,如果出现这样的代码,设计师就要考虑怎么修改架构了。注意事项61997年2月,绵羊“多利”诞生。这一个不寻常的生命。这是英国生物学家通过从绵阳身上取下是一个细胞,复制出的绵阳宝宝,克隆技术由此而生。Java对克隆技术的应用主要是对对象的创建,它采取二进制的方式,大大提高了创建对象的效率。克隆备忘录使用了java的克隆机制,利用克隆实现备份。克隆备忘录7下面我们从类图和代码的角度,演绎下多利的诞生过程。类图:代码:com.li.clone 见证多利的诞生8通过类图可以看出,克隆备忘录主要由两个角色: Sheep:发起者角

6、色,包含状态属性(state),备份状态函数(createMemento())、和恢复函数(restoreMemento())。 Manager 对发起者绵阳进行管理。另外Sheep类还实现了Clonable接口,实现了clone函数,目的是在关键时刻创建自己的替身多利。绵阳平时悠然地在大自然中吃草,但狼来了的时候,它就创建个替身多利,就像孙悟空拔根毫毛变成小猴子一样,替他喂狼,自己则逃之夭夭。代码:com.li.clone 从角色入手9和普通备忘录相比,克隆备忘录省略了备忘录角色(Memento),Manager类直接管理创始类角色(Sheep)。优点:程序简单了,对高层依赖减少了。面临深拷

7、贝和浅拷贝的问题,在复杂场景它会让逻辑异常混乱,出现错误也很难跟踪。克隆感悟10在实际开发中一个对象不可能只有一个状态,一个JavaBean有多个属性很常见,这都是它的状态。以数据库为例,数据库中包括控制文件、数据文件、日志文件这些在备份中一个都不能少,少了,恢复过程中就会出现问题。这样每个文件就相当于一个状态,数据库的备份就属于多状态备份。多状态备忘录11类图:用类图展示数据库备份12角色依然差不多,但类图中多出来一个工具类BeanUtils用于数据的备份与恢复。BeanUtils工具类中调用了jdk包java.beans和java.lang.reflect中的类,动态传人bean,提取be

8、an中的属性名和属性值放入map中备份。恢复也类似,把备份后的属性值取出来放回bean中。另外,多状态是利用HashMap来实现的,Memento中原本备份的是状态,现在备份的是HashMap,HashMap中存放的依然是状态。其实多状态和单状态的区别只有两点:一是Memento角色的变化,二是增加了BeanUtils工具类用来备份和恢复。代码:com.li.multistate用HashMap维护多状态13事实上,我就在讲Flashback根据时间戳恢复时,我们给了一个时间戳,就能恢复到时间戳对应的点的数据。比如我们给一个时间戳是230,我们就能恢复2012年6月5日19点30分30秒时的数据,这应该是多备份,以时间戳为KEY值,对各个时间点进行备份。针对数据库备份,一个备份是搞不定的。其实Oracle的备份机制是多状态,多备

温馨提示

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

评论

0/150

提交评论