设计模式之第17章-备忘录模式(Java实现)
设计模式之第17章-备忘录模式(Java实现)
好男人就是我,我就是曾小贤。最近陈赫和张子萱事件闹得那是一个沸沸扬扬。想想曾经每年都有爱情公寓陪伴的我现如今过年没有了爱情公寓总是感觉缺少点什么。不知道你们可曾记得爱情公寓里的一个经典的桥段~每次关谷和唐悠悠吵架的时候,总是可以进行“存档”,先干其他的事情,而后有时间的时候再继续“读档”,这是多么好的一个技能啊,想想吧,每次吵架,存档后可以做其他事情进行冷静一下,然后读档的时候已经冷静好了,是不是会清醒很多呢,是不是就不会有那么多的误会无法解除了呢?在这个事件中,他们两位用到了接下来出场的“备忘录模式”。好了,接下来有请备忘录~(众人:鱼哥真是越来越啰嗦了啊。吐槽帝啊简直,不,还是一个吃货。)
备忘录模式之自我介绍
  鄙人不才,提供了一个不存在于真实世界的备忘录模式。说的通俗易懂一点就是传说中的“后悔药”。想想吧,当你做错什么事情的时候,只需“读档”到做错事之前就可以再来一遍,那是多少人心中所想,或者当你由于某些原因曾错过某些人某些事的时候,“读档”到这件事之前是多么令人心动。这样的话,有多少没有勇气去做的事情,会在有“后悔药”之后敢于一次又一次的尝试,在游戏中,敢于无数次的开荒、PK的人不正是因为无限的“复活”。好了,不再啰嗦,有关我的定义是:Without violating cncapsulation, capture and externalize an object's internal state so that the object can be restored to this state later.翻译过来就是说:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。说的直白一点,就是说将一个一个对象进行备份,提供了一种程序数据的备份方法,它的通用类图是:
备忘录模式之自我分析
分析未动,缺点先行:
- 首先来说,使用备忘录代价会比较高:如果原发器在生成备忘录时,必须拷贝并存储大量的信息,或者客户非常频繁地创建备忘录和恢复原发器状态,可能造成很大的开销。
 - 在某些语言中难以保证只有原发器可访问备忘录的状态。
 - 维护备忘录的潜在代价会比较高。由于管理器不知道备忘录中有多少个状态,因此存储备忘录时一个原本很小的管理器也可能产生大量的存储。
 
至于优点,列举如下:
- 保持封装边界。使用备忘录可以避免暴露一些只应由原发器管理却又必须存储在原发器之外的信息。
 - 简化了原发器。由于把存储管理的重任交给了Originator,让客户管理它们请求的状态将会简化Originator,并且使得客户工作结束时无需通知原发器。
 
备忘录模式之实现
既然都说到了爱情公寓,那么就以爱情公寓的关谷来举个栗子。首先是关谷类,关谷类记录了关谷当时吵架的心情以及关谷在存档之后的变化:
 public class GuanGu{
     //吵架时关谷的状态
     private String state = "";
     //存档后的状态改变
     public void changeState(){
         this.state = "心情变得冷静下来";
     }
     public String getState(){
         return state;
     }
     public void setState(String state){
         this.state = state;
     }
     //保留备份
     public Memento createMemento(){
         return new Memento(this.state);
     }
     //恢复备份
     public void restoreMemento(Memento memento){
         this.setState(memento.getState());
     }
 }
接下来就是比较重要的Memento类了,实现起来极其简单,非常纯粹的JavaBean:
 public class Memento{
     //关谷的心情
     private String state = "";
     //通过构造函数传递心情
     public Memento(String state){
         this.state = state;
     }
     public String getState(){
         return state;
     }
     public void setState(String state){
         this.state = state;
     }
 }
最后就是备忘录的管理员角色,用来对备忘录进行管理、保存和提供备忘录。备忘录的管理员类也很简单:
 public class Caretaker{
     //备忘录对象
     private Memento memento;
     public Memento getMemento(){
         return memento;
     }
     public void setMemento(Memento memento){
         this.memento = memento;
     }
 }
至此,备忘录模式就实现了。
备忘录模式之应用场景
那么问题来了,什么时候才能使用备忘录模式呢:
- 需要保存和恢复数据的相关状态场景。
 - 提供一个可回滚的操作,比如说各种编辑器中的Ctrl+Z组合键。
 - 需要监控的副本场景中。
 - 数据库连接的事务管理就是用的备忘录模式。
 
以上。预知后式如何,且听下回分解。
PS:本博客欢迎转发,但请注明博客地址及作者~
博客地址:http://www.cnblogs.com/voidy/
博客新址:http://voidy.net
<。)#)))≦
设计模式之第17章-备忘录模式(Java实现)的更多相关文章
- 设计模式之第6章-迭代器模式(Java实现)
		
设计模式之第6章-迭代器模式(Java实现) “我已经过时了,就不要讲了吧,现在java自带有迭代器,还有什么好讲的呢?”“虽然已经有了,但是具体细节呢?知道实现机理岂不美哉?”“好吧好吧.”(迭代器 ...
 - 设计模式之第7章-外观模式(Java实现)
		
设计模式之第7章-外观模式(Java实现) “鱼哥,知道怎么把大象装进冰箱里面么?”(作者按:这么简单的问题还想考我,早了几百年吧.)“把大象装进冰箱里,一共需要三步:第一步,把冰箱门打开:第二步,把 ...
 - 设计模式之第22章-组合模式(Java实现)
		
设计模式之第22章-组合模式(Java实现) “鱼哥,有没有什么模式是用来处理树形的“部分与整体”的层次结构的啊.”“当然”“没有?”“有啊.别急,一会人就到了.” 组合模式之自我介绍 “请问你是?怎 ...
 - 设计模式之第21章-状态模式(Java实现)
		
设计模式之第21章-状态模式(Java实现) “what are you 干啥了?怎么这么萎靡不振?”“昨晚又是补新番,又是补小笼包,睡得有点晚啊.话说杨过的那个雕兄真是太好了,每天给找蛇胆,又陪练武 ...
 - 设计模式之第20章-访问者模式(Java实现)
		
设计模式之第20章-访问者模式(Java实现) “嘿,你脸好红啊.”“精神焕发.”“怎么又黄了?”“怕冷,涂的,涂的,蜡.”“身上还有酒味,露馅了吧,原来是喝酒喝的啊.”“嘿嘿,让,让你发现了,今天来 ...
 - 设计模式之第16章-代理模式(Java实现)
		
设计模式之第16章-代理模式(Java实现) “现在朋友圈真是太让人蛋疼了啊.”“怎么说?”“一堆代理,各种卖东西的,看着好烦人.”“哎,删了呗.”“都是朋友,哪里好意思删啊.”“这倒也是...哎,迫 ...
 - 设计模式之第14章-命令模式(Java实现)
		
设计模式之第14章-命令模式(Java实现) “小明,滚出去.”“小明,这个问题怎么做?”(可怜的小明无奈躺枪.小明:老师,我和你有什么仇什么怨,我和你有什么仇什么怨啊到底...老师:小明,滚出去.习 ...
 - 设计模式之第11章-建造者模式(Java实现)
		
设计模式之第11章-建造者模式(Java实现) “那个餐厅我也是醉了...”“怎么了?”“上菜顺序啊,竟然先上甜品,然后是冷饮,再然后才是菜什么的,无语死了.”“这个顺序也有人这么点的啊.不过很少就是 ...
 - 设计模式之第10章-桥接模式(Java实现)
		
设计模式之第10章-桥接模式(Java实现) “一入软件深似海,从此早睡是路人.黑夜给了我黑色的眼睛,我却用他去寻找八阿哥.”“怎么了,又来那么多的感慨啊.”“还能有什么啊,老板是说让换个APP做,这 ...
 
随机推荐
- JAVA中日期格式转换各个字母代表含义
			
G Era 标志符 Text AD y 年 Year 1996; 96 M 年中的月份 Month July; Jul; 07 w 年中的周数 Number 27 W ...
 - 树莓派-(一)开箱到点亮一些坑(无屏、无wlan、无直连键鼠)
			
0x00.前期准备: 材料: 树莓派3b+ 板子 * 1,适配电源 * 1,网线 * 2,sd卡16G * 1,读卡器 * 1 安装时注意,3b+三个散热片贴好.小风扇接线要接对 工具: 0x01. ...
 - 构建第一个spring boot2.0应用之项目启动运行的几种方式(二)
			
方法一. 配置Run/Debug Configuration 选择Main Class为项目 Application启动类(入口main方法) (2).进行项目目录,即包含pom.xml的目录下,启 ...
 - graylog插件的安装
			
什么是插件和插件的作用我就不说了,大家应该都知道了. 安装方法是打开下面选择项 进去后出现如下界面 选择事先下载好的插件后,点击上传.这里以nginx日志插件为例 之后查看效果,发现对应的过滤 ...
 - 获取win10 Insider Preview报错0x80080300
			
获取win10 Insider Preview报错0x80080300 1.msconfig2.隐藏Microsoft 服务3.disable 剩下的服务4.win + i, Update&s ...
 - [转载]AngularJS入门教程04:双向绑定
			
在这一步你会增加一个让用户控制手机列表显示顺序的特性.动态排序可以这样实现,添加一个新的模型属性,把它和迭代器集成起来,然后让数据绑定完成剩下的事情. 请重置工作目录: git checkout -f ...
 - 异常:System.InvalidOperationException: This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms 这个实现是不是Windows平台FIPS验证的加密算法。解决方法
			
遇见这个问题是在使用了MD5加密算法后报错的,可能的原因如下: 1.FIPS不兼容MD5,此时需要修改注册表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\C ...
 - Android(java)学习笔记79:Android中SimpleAdapter,ArrayAdapter和BaseAdapter常见的适配器
			
1. SimpleAdapter(BaseAdapter子类扩展类): simpleAdapter的扩展性最好,可以定义各种各样的布局出来,可以放上ImageView(图片)等.可以显示比较复杂的列表 ...
 - php xdebug扩展无法进入断点问题
			
Waiting for incoming connection with ide key 看到这句话就恶心 这两天搞php运行环境搞的头大,好在现在终于调通了,可以正常进入断点了 现在记录一下,避免下 ...
 - 转:Python集合(set)类型的操作
			
转自:http://blog.csdn.net/business122/article/details/7541486 python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系 ...