《JAVA与模式》之备忘录模式
一、备忘录(Memento)模式结构
备忘录对象是一个用来存储另外一个对象内部状态的快照(snapshot)的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉住,并外部化,存储起来,从而可以在将来适合的时候把这个对象还原到存储起来的状态。备忘录模式常常与命令模式和迭代子模式一同使用。
备忘录模式的结构图如下所示
aaarticlea/png;base64,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" alt="" />
备忘录模式涉及三个角色:备忘录(Memento)角色、发起人(Originator)角色、负责人(Caretaker)角色。
备忘录角色:
(1) 将发起人对象的内部状态存储起来,备忘录可以根据发起人对象的判断来决定存储多少发起人对象的内部状态。
(2) 备忘录可以保护其内容不被发起人对象之外的任何对象所读取。
备忘录有两个等效的接口:
窄接口:负责人(Caretaker)对象和其他除发起人对象之外的任何对象看到的是备忘录的窄接口(narrow interface),这个窄接口只允许它把备忘录对象传给其他对象。
宽接口:与负责人对象看到的窄接口相反的是,发起人对象可以看到一个宽接口(wide interface),这个宽接口允许它读取所有的数据,以便根据这些数据恢复这个发起人对象的内部状态。
发起人角色:
(1) 创建一个含有当前的内部状态的备忘录对象。(2)使用备忘录对象存储其内部状态。
负责人角色:
(1) 负责保存备忘录对象。(2)不检查备忘录对象的内容。
代码如下:
public static void main(String[] args) { //发起者
Originator originator=new Originator();
Caretaker caretaker=new Caretaker();
originator.setState("a");
MementoIF mementoIF=originator.createMemento(); caretaker.saveMemento(mementoIF);
//改变状态
originator.setState("b");
System.out.println("当前state=="+originator.getState());
//恢复状态
mementoIF=caretaker.retrieveMemento();
originator.restoreMemento(mementoIF);
System.out.println("当前state=="+originator.getState());
} } interface MementoIF{}
//发起者
class Originator { private String state; public Originator(){} //创建一个备忘录
public MementoIF createMemento(){ return new Memento(this.state);
}
//将发起者恢复到备忘录对象记录的状态
public void restoreMemento(MementoIF mementoIF){ Memento memento=(Memento) mementoIF; this.state=memento.getState();
} public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
System.out.println("state="+state);
} //内部类 备忘录
class Memento implements MementoIF{
private String state;
public Memento(String state){
this.state=state; }
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
} }
}
//备忘录负责人
class Caretaker{ private MementoIF mementoIF; public MementoIF retrieveMemento(){ return this.mementoIF;
} public void saveMemento(MementoIF mementoIF){ this.mementoIF=mementoIF;
} }
执行结果:
state=a
state=b
当前state==b
当前state==a
二、多检查点备忘录
参考:http://www.cnblogs.com/java-my-life/archive/2012/06/06/2534942.html
三、备忘录模式在Java中的应用
J2EE框架中备忘录模式的应用
Java引擎提供Session对象,可以弥补HTTP协议的无状态缺点,存储用户的状态。当一个新的网络用户调用一张JSP网页或者Servlet时,Servlet引擎会创建一个对应于这个用户的Session对象,具体的技术细节可能是向客户端浏览器发送一个含有Session ID的Cookie,或者使用URL改写技术将Session ID 包括在URL中等。在一段有效时间里,同一个浏览器可以反复访问服务器,而Servlet引擎便可以使用这个Session ID来判断来访者应当与哪一个Session对象对应。Session和Cookie的使用都是备忘录模式,如下图所示:
四、备忘录模式的优缺点
优点:
1、 有时一些发起人对象的内部信息必须保存在发起人对象以外的地方,但是必须要由发起人对象自己读取。这时,使用备忘录可以把复杂的发起人内部信息对其他的对象屏弊起来,从而可以恰当地保持封装的边界。
2、 本模式简化了发起人类,发起人不再需要管理和保存其内部状态的一个个版本,客户端可以自行管理它们所需要的这些状态的版本。
3、 当发起人角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原。
缺点:
1、 如果发起人角色的状态需要完整地存储到备忘录对象中,那么在资源消耗上面备忘录对象会很昂贵。
2、 当负责人角色将一个备忘录存储起来的时候,负责人可能并不知道这个状态会占用多大的存储空间,从而无法提醒用户一个操作是否会昂贵。
参考:
http://blog.csdn.net/fg2006/article/details/6575760
http://men4661273.iteye.com/blog/1633484
《JAVA与模式》之备忘录模式的更多相关文章
- 重学 Java 设计模式:实战备忘录模式「模拟互联网系统上线过程中,配置文件回滚场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 实现不了是研发的借口? 实现不了,有时候是功能复杂度较高难以实 ...
- java设计模式-----21、备忘录模式
概念: Memento模式也叫备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是GoF的23种设计模式之一,属于行为模式,它的作用是保存对象的内部状态,并在需要的时候(u ...
- Java设计模式学习记录-备忘录模式
前言 这次要介绍的是备忘录模式,也是行为模式的一种 .现在人们的智能手机上都会有备忘录这样一个功能,大家也都会用,就是为了记住某件事情,防止以后自己忘记了.那么备忘录模式又是什么样子的呢?是不是和手机 ...
- Java设计模式(21)——行为模式之备忘录模式(Memento)
一.概述 概念 UML简图 角色 根据下图得到角色 备忘录角色(Memento).发起人角色(Originator).负责人角色(Caretaker) 二.实践 使用白箱实现,给出角色的代码: 发起人 ...
- 《JAVA设计模式》之备忘录模式(Memento)
在阎宏博士的<JAVA与模式>一书中开头是这样描述备忘录(Memento)模式的: 备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式. 备忘录 ...
- 《Android源码设计模式》--状态模式--责任链模式--解释器模式--命令模式--观察者模式--备忘录模式--迭代器模式
[状态模式] No1: Wifi设置界面是一个叫做WifiSetting的Fragment实现的 No2: 在不同的状态下对于扫描Wifi这个请求的处理是完全不一样的.在初始状态下扫描请求被直接忽略, ...
- 设计模式20---设计模式之备忘录模式(Memento)(行为型)
1.讲解备忘录模式 备忘录模式(Memento Pattern)又叫做快照模式(Snapshot Pattern)或Token模式,是GoF的23种设计模式之一,属于行为模式. 1.1定义 在不破坏封 ...
- 行为型模式(十) 备忘录模式(Memento)
一.动机(Motivate) 我们看上图,一个对象肯定会有很多状态,这些状态肯定会相互转变而促进对象的发展,如果要想在某一时刻把当前对象回复到以前某一时刻的状态,这个情况用"备忘录模式&qu ...
- Head First设计模式——中介者模式和备忘录模式
中介者 中介者模式:使用中介者来集中相关对象之间复杂的沟通方式和控制方式. Bob有一个自动屋,当他的闹钟响了只有,闹钟会告诉咖啡壶开始煮咖啡.后来客户不断的提出许多新需求:周末不要提供咖啡.下班后需 ...
- 设计模式---状态变化模式之备忘录模式(Memento)
一:概念 用于保存对象的内部状态,并在需要的时候(undo/rollback)回复对象以前的状态 二:应用场景 如果一个对象需要保存状态并可通过undo或rollback等操作恢复到以前的状态时,可以 ...
随机推荐
- IncrediBuild 2.40 过期时间
IncrediBuild 2.40的License有2个文件CoordLicense.dat和AgentLicense.dat,分别位于Coordinator和Agent安装目录下,这两个文件都是RS ...
- ASP入门(十五)- Global.asa
Global.asa 文件是一个可选文件,它可包含被 ASP 应用程序中每个页面访问的对象.变量和方法的声明.所有合法的浏览器脚本都可以在 Global.asa 中使用. Global.asa 文件只 ...
- eclipse maven scm
http://my.oschina.net/OutOfMemory/blog/178512 1.安装eclipse的maven插件 m2e(http://wiki.eclipse.org/M2E_u ...
- LintCode: Unique Characters
C++, time: O(n^2) space: O(0) class Solution { public: /** * @param str: a string * @return: a boole ...
- ORA-01654错误
问题现象: 测试库使用如下方式创建索引: create index IDX_ANA_OFFICE on ANA (OFFICE_CITY, OFFICE_NO) tablespace IDX ...
- SLF4J warning or error messages and their meanings
来自:http://www.slf4j.org/codes.html#StaticLoggerBinder The method o.a.commons.logging.impl.SLF4FLogFa ...
- 数据库查询语句报错-ORA-00911: invalid character
数据库查询语句报错-ORA-00911: invalid character 根据自己经验总结下: 1.都是分号惹的祸,有时候sql语句后面有分好导致这种错误 2.还有一种是从别处copy过来的sql ...
- 【PMP】三点估算法
通过考虑估算中的不确定性和风险,可以提高持续时间估算的准确性. 最可能时间(tM):基于最可能获得的资源.最可能取得的资源生产率.对资源可用时间的现实预计,资源对其他参与者的可能依赖关系及可能发生的各 ...
- 防止跨站请求伪造(CSRF)攻击 和 防重复提交 的方法的实现
CSRF的概念可以参考:http://netsecurity.51cto.com/art/200812/102951.htm 本文介绍的是基于spring拦截器的Spring MVC实现 首先配置拦截 ...
- centos6.5关闭ipv6
万境归空,道法自然 1.在/etc/modprobe.d/目录下增加一个新的配置文件ipv6.conf cat << EOF > /etc/modprobe.d/ipv6.confa ...