阿蜜果
不驕,不矜,勤工,好學,才是好女子
你所浪費的今天,是昨天死去的人奢望的明天。
你所厭惡的現在,是未來的你回不去的曾經。
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
阿蜜果
閱讀(4461)
評論(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新聞
Chat2DB
C++博客
博問
管理
相關文章:
蜜果私塾:在JavaScript中使用適配器模式
蜜果私塾:在JavaScript中使用工廠模式
蜜果私塾:在JavaScript中使用單例模式
設計模式學習筆記--觀察者模式(Observer) (未完待續)
設計模式學習筆記--調停者模式(Mediator)
設計模式學習筆記--備忘錄模式(Memento)
設計模式學習筆記--策略模式(待續)
設計模式學習筆記--模板方法(Template Method)模式
設計模式學習筆記--建造模式(Builder)
設計模式學習筆記--原型(Prototype)
Copyright ©2025 阿蜜果 Powered by:
博客園
模板提供:
滬江博客
<
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月出版)
留言簿
(263)
給我留言
查看公開留言
查看私人留言
隨筆分類
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
即興的靈感
壞男孩
孫衛琴
施偉
螞蟻
銀河使者
鼠標
積分與排名
積分 - 2294312
排名 - 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(143711)
2.?用Ant實現Java項目的自動構建和部署(123981)
3.?異常備忘:java.lang.UnsupportedClassVersionError: Bad version number in .class file(114272)
4.?Java代碼規范、格式化和checkstyle檢查配置文檔(71822)
5.?常用加密算法的Java實現總結(一)——單向加密算法MD5和SHA(62382)
6.?通用權限管理系統設計篇(三)——概要設計說明書(61738)
7.?使用XFire+Spring構建Web Service(一)——helloWorld篇(53661)
8.?基于注解的Spring MVC+Hibernate簡單入門(52588)
9.?在阿里云Linux服務器上安裝MySQL(49641)
10.?關系型數據的分布式處理系統MyCAT(1)—概述和基本使用教程(47770)
評論排行榜
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)
主站蜘蛛池模板:
亚洲国产精品婷婷久久
|
国产无遮挡吃胸膜奶免费看
|
亚洲中文无码永久免
|
69视频在线是免费观看
|
亚洲AV无码成人专区片在线观看
|
丰满人妻一区二区三区免费视频
|
国内精品99亚洲免费高清
|
中文字幕免费在线看
|
亚洲国产精品无码久久久蜜芽
|
野花香在线视频免费观看大全
|
亚洲精品成人片在线观看精品字幕
|
黄色网站软件app在线观看免费
|
国产亚洲精品一品区99热
|
久久国产乱子伦精品免费看
|
2022年亚洲午夜一区二区福利
|
1000部夫妻午夜免费
|
亚洲人成高清在线播放
|
国产精品久久久久久久久久免费
|
日韩亚洲人成在线
|
国产男女猛烈无遮挡免费视频网站
|
色综合久久精品亚洲国产
|
亚洲成a人无码av波多野按摩
|
japanese色国产在线看免费
|
亚洲av中文无码乱人伦在线r▽
|
精品一区二区三区免费毛片爱
|
亚洲日日做天天做日日谢
|
国产最新凸凹视频免费
|
在线免费观看伊人三级电影
|
亚洲激情视频网站
|
在线永久免费观看黄网站
|
一级一级一级毛片免费毛片
|
亚洲欧洲日产国产综合网
|
四虎免费在线观看
|
a级毛片免费全部播放无码
|
亚洲成a人片在线观
|
四虎永久在线精品免费影视
|
亚洲成色在线综合网站
|
毛片网站免费在线观看
|
国产免费牲交视频免费播放
|
二区久久国产乱子伦免费精品
|
久久久久亚洲AV无码网站
|