阿蜜果
不骄,不矜,勤工,好学,才是好女子
你所浪费的今天,是昨天死去的人奢望的明天。
你所厌恶的现在,是未来的你回不去的曾经。
BlogJava
首页
新随笔
新文章
联系
聚合
管理
posts - 297, comments - 1618, trackbacks - 0
设计模式学习笔记--备忘录模式(Memento)
备忘录模式(Memento)
属于对象的
行为模式
。
备忘录模式是我觉得最容易理解的一种模式,它的名字取得非常的贴切。
1. 定义
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
2. 使用的原因
想要恢复对象某时的原有状态
3. 适用的情况举例
有很多备忘录模式的应用,只是我们已经见过,却没细想这是备忘录模式的使用罢了,略略举几例:
eg1. 备忘录在jsp+javabean的使用:
在一系统中新增帐户时,在表单中需要填写用户名、密码、联系电话、地址等信息,如果有些字段没有填写或填写错误,当用户点击“提交”按钮时,需要在新增页面上保存用户输入的选项,并提示出错的选项。这就是利用JavaBean的scope="request"或scope="session"特性实现的,即是用备忘录模式实现的。
eg2. 修理汽车的刹车时。首先移开两边的挡板,露出左右刹车片。只能卸下一片,这时另一片作为一个备忘录来表明刹车是怎样安装的。在这片修理完成后,才可以卸下另一片。当第二片卸下时,第一片就成了备忘录。
eg3. 都说人生没有后悔药可买,我们都在为所做的事付出着代价,但在软世界里却有“后悔药”,我改变了某东西的某些状态之后,只要我们之前保存了该东西的某状态,我们就可以通过备忘录模式实现该东西的状态还原,其实这何尝不是一个能使时光倒流的“月光宝盒”,总“神奇”一词了得。
4. 类图结构及说明
1)类图如下所示:
2)类说明
i)Memento:备忘录角色, 主要负责的工作如下:
将发起人对象的内部状态存储起来;
可以保护其内容不被发起人(Originator)对象之外的任何对象所读取。
ii)Originator:发起人角色,主要完成如下工作:
创建一个含有当前的内部状态的备忘录对象;
使用备忘录对象存储其内部状态。
iii)Caretaker:负责人角色,完成工作如下:
负责保存备忘录对象;
不保存备忘录对象的内容。
5. 使用举例
1)需求
Amigo的mother对Amigo当前的状态很不满意:不爱打扮,做事拖拖拉拉,十足马大哈。该mother想对Amigo进行改造,但又唯恐改造后还不如从前的Amigo好,有可能需要实现“时光倒流”功能。
2)分析
经过细细分析,这个状态保存功能其实可以通过备忘录模式来得到很好的实现,可通过备忘录来保存Amigo当前的状态:不爱打扮,做事拖拖拉拉,十足马大哈,以及其它的N多优点(哈哈哈。。。),如果改造后的Amigo不如从前,那我们让我们的“月光宝盒”来实现一下“时光倒流”,真神奇啊。。。
3)代码参考实现
i)发起人角色
public
class
Originator
{
private
String state;
/** */
/**
* 工厂方法,返回一个新的备忘录对象
*/
public
Memento createMemento
{
return
new
Memento(state);
}
/** */
/**
* 将发起人恢复到备忘录对象所记载的状态
*/
public
void
restoreMemento(Memento memento)
{
this
.state
=
memento.getState();
}
//
省略状态state的getter和setter方法
}
ii)备忘录角色
public
class
Memento
{
private
String state;
/** */
/**
* 构造函数
*/
public
Memento(String state)
{
this
.state
=
state;
}
//
省略state的getter和setter方法
}
iii)负责人角色
public
class
Caretaker
{
private
Memento memento;
/** */
/**
* 备忘录的取值方法
*/
public
Memento retrieveMemento
{
return
this
.memento;
}
/** */
/**
* 备忘录的保存方法
*/
public
void
saveMemento(Memento memento)
{
this
.memento
=
memento;
}
}
iv)客户端模拟实现
public
class
Client
{
private
static
Originator ori
=
new
Originator();
private
static
Caretaker taker
=
new
Caretaker();
public
static
void
main(String[] args)
{
//
amigo当前的状态
ori.setState(
"
不爱打扮,做事拖拖拉拉,十足马大哈
"
);
//
保存amigo当前的状态
taker.saveMemento(ori.createMemento());
//
mother要对amigo进行改造
ori.setState(
"
穿着时髦,做事精练
"
);
//
mother发现改造后产生了很多副作用,于是反悔了,要恢复女儿以前的样子
ori.restoreMemento(taker.retrieveMemento());
//
amigo被打回原型,^_^
System.out.println(
"
amigo当前情况:
"
+
ori.getState());
}
}
mother真是滴,一棍子将我打回原型了。
无语也。。。
参考书籍:《Java与模式》
《Patterns in Java》
《深入简出Java设计之备忘录模式》
http://www.pcdog.com/edu/java/2005/12/z059917_2.html
《软件设计模式的非软件例子》
http://blog.csdn.net/gzzzz/archive/2004/10/04/124705.aspx
posted on 2007-04-12 00:11
阿蜜果
阅读(4443)
评论(6)
编辑
收藏
所属分类:
Design Pattern
FeedBack:
#
re: 设计模式学习笔记--备忘录模式(Memento)
2007-04-12 08:32 |
ant
很棒!有深度的一篇,^_^。
回复
更多评论
#
re: 设计模式学习笔记--备忘录模式(Memento)
2007-04-12 09:02 |
坏男孩
up
回复
更多评论
#
re: 设计模式学习笔记--备忘录模式(Memento)
2007-04-12 09:08 |
坏男孩
建议把java的设计模式都用你自己的生活体会替代,我相信到时候大家都会了解amigo的,比如通过这篇我就知道amigo-朴实,落落大方,而且善于观察和思考!
回复
更多评论
#
re: 设计模式学习笔记--备忘录模式(Memento) [未登录]
2007-04-12 10:11 |
阿蜜果
@坏男孩
貌似是个好建议
回复
更多评论
#
re: 设计模式学习笔记--备忘录模式(Memento)
2007-04-12 11:13 |
嘎嘎
继续崇拜中。。。
回复
更多评论
#
re: 设计模式学习笔记--备忘录模式(Memento)
2007-06-28 17:37 |
chars
还不错,但是封装性不是很好,没有较好的利用宽窄接口,不过很好理解
回复
更多评论
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
管理
相关文章:
蜜果私塾:在JavaScript中使用适配器模式
蜜果私塾:在JavaScript中使用工厂模式
蜜果私塾:在JavaScript中使用单例模式
设计模式学习笔记--观察者模式(Observer) (未完待续)
设计模式学习笔记--调停者模式(Mediator)
设计模式学习笔记--备忘录模式(Memento)
设计模式学习笔记--策略模式(待续)
设计模式学习笔记--模板方法(Template Method)模式
设计模式学习笔记--建造模式(Builder)
设计模式学习笔记--原型(Prototype)
<
2007年4月
>
日
一
二
三
四
五
六
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
生活将我们磨圆,是为了让我们滚得更远——“圆”来如此。
我的作品:
玩转Axure RP
(2015年12月出版)
Power Designer系统分析与建模实战
(2015年7月出版)
Struts2+Hibernate3+Spring2
(2010年5月出版)
留言簿
(262)
给我留言
查看公开留言
查看私人留言
随笔分类
Ajax(3)
Ant(1)
Auto Code(4)
Cewolf
CMMI(1)
CSS(2)
CVS(1)
database(15)
Design Pattern(11)
Eclipse BIRT(1)
EJB
extremecomponents(1)
GIS(2)
Hibernate(8)
iBATIS(2)
IDE(1)
Inno Setup(2)
IT评论(2)
Java(36)
Javascript(32)
JBoss(1)
JFreeChart(3)
JFreeReport(3)
JSF
Linux(3)
MySql(11)
Open Source(4)
Oracle(5)
Other(13)
Spring(12)
Sql Server(1)
Struts(7)
Struts2(8)
Tomcat
UML
Web(8)
Web Service(3)
Workflow
产品原型设计(8)
似水流年(13)
协议(12)
原创小说(1)
技术评论
架构师之路(12)
电信知识(3)
网络通信相关(11)
职场感悟(6)
解决方案(12)
项目管理(8)
随笔档案
2016年3月 (2)
2015年11月 (1)
2015年9月 (1)
2015年6月 (3)
2015年5月 (4)
2014年12月 (2)
2014年7月 (1)
2014年6月 (1)
2014年5月 (2)
2014年1月 (2)
2013年10月 (1)
2013年8月 (1)
2013年7月 (1)
2013年4月 (1)
2013年2月 (1)
2012年11月 (2)
2012年10月 (1)
2012年1月 (1)
2011年11月 (8)
2011年10月 (4)
2011年9月 (1)
2011年8月 (2)
2011年7月 (5)
2011年2月 (2)
2011年1月 (1)
2010年12月 (3)
2010年11月 (9)
2010年9月 (1)
2010年7月 (2)
2010年6月 (2)
2010年5月 (5)
2010年4月 (2)
2009年12月 (4)
2009年11月 (2)
2009年10月 (1)
2009年9月 (3)
2009年8月 (5)
2009年7月 (5)
2009年5月 (1)
2008年10月 (3)
2008年9月 (3)
2008年8月 (1)
2008年6月 (2)
2008年5月 (3)
2008年4月 (2)
2008年2月 (2)
2008年1月 (11)
2007年12月 (9)
2007年11月 (7)
2007年10月 (9)
2007年9月 (12)
2007年8月 (24)
2007年7月 (10)
2007年6月 (2)
2007年5月 (3)
2007年4月 (18)
2007年3月 (24)
2007年2月 (24)
文章分类
喜爱歌词(12)
生活点滴(3)
芝麻粒知识(8)
英语(1)
相册
java学习相关
other
产品经理相关
图书相关
工具相关
日历
架构师相关
设计模式相关
贴图
走走拍拍
饭团
关注blog
BeanSoft
JAVA-HE
kenzhang
即兴的灵感
坏男孩
孙卫琴
施伟
蚂蚁
银河使者
鼠标
积分与排名
积分 - 2284416
排名 - 3
最新评论
1. re: 新书推荐:《Power Designer系统分析与建模实战》
你好。买了书,麻烦把书中的样例工程文件发给我。非常感谢。
我的邮箱:wen027andy@163.com
--文良
2. re: 新书推荐:《Power Designer系统分析与建模实战》
@智禄
谢谢指出,下次改版修正:)
--阿蜜果
3. re: 新书推荐:《Power Designer系统分析与建模实战》
6.1.3 9.存储函数
存储函数与存储函数类似,……
此处应该是:存储函数与存储过程类似,……
我买的是多看上的电子版,请修改
--智禄
4. re: 新书推荐:《Power Designer系统分析与建模实战》
您好,今天买了您的这本书,为了更好的学习,麻烦将书中的样例工程文件发给我,万分感谢,感谢作者写出这么好的书,我特别需要,祝大卖~~
yaozhilu@foxmail.com
--智禄
5. re: 新书推荐:《Power Designer系统分析与建模实战》
您好,书不错,已经买了,麻烦发套样例工程吧,最好详细点的,万分感激!
jackylee365@163.com
--李成龙
阅读排行榜
1. 常用加密算法的Java实现总结(二)——对称加密算法DES、3DES和AES(143652)
2. 用Ant实现Java项目的自动构建和部署(123933)
3. 异常备忘:java.lang.UnsupportedClassVersionError: Bad version number in .class file(113763)
4. Java代码规范、格式化和checkstyle检查配置文档(71749)
5. 常用加密算法的Java实现总结(一)——单向加密算法MD5和SHA(62333)
6. 通用权限管理系统设计篇(三)——概要设计说明书(61690)
7. 使用XFire+Spring构建Web Service(一)——helloWorld篇(53569)
8. 基于注解的Spring MVC+Hibernate简单入门(52550)
9. 在阿里云Linux服务器上安装MySQL(49558)
10. 关系型数据的分布式处理系统MyCAT(1)—概述和基本使用教程(47728)
评论排行榜
1. 使用XFire+Spring构建Web Service(二)(102)
2. 使用XFire+Spring构建Web Service(一)——helloWorld篇(70)
3. 通用权限管理系统设计篇(三)——概要设计说明书(64)
4. 异常备忘:java.lang.UnsupportedClassVersionError: Bad version number in .class file(54)
5. 通用权限管理设计篇(二)——数据库设计(40)