備忘錄模式是我覺得最容易理解的一種模式,它的名字取得非常的貼切。
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)發起人角色






























































































無語也。。。
參考書籍:《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