




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、www.ChinaSA.infoDesign Patterns備忘錄模式*www.ChinaSA.info大綱備忘錄模式概述備忘錄模式的結構與實現備忘錄模式的應用實例備忘錄模式的優缺點與適用環境www.ChinaSA.info備忘錄模式概述備忘錄模式軟件中的“后悔藥”撤銷(Undo)www.ChinaSA.info備忘錄模式概述分析通過使用備忘錄模式可以通過使用備忘錄模式可以讓系統讓系統恢復到某一特定的歷史狀態恢復到某一特定的歷史狀態首先首先保存軟件系統的歷史狀態保存軟件系統的歷史狀態,當用戶需要取消錯誤操作并且返當用戶需要取消錯誤操作并且返回到某個歷史狀態時,可以回到某個歷史狀態時,可以取出
2、取出事先保存的歷史狀態來覆蓋當前事先保存的歷史狀態來覆蓋當前狀態狀態www.ChinaSA.info備忘錄模式概述備忘錄模式的定義對象行為型對象行為型模式模式備忘錄模式備忘錄模式:在不破壞封裝的前提下在不破壞封裝的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態,這樣就可以在以后將對象恢復到原先保存的狀態可以在以后將對象恢復到原先保存的狀態。Memento Pattern: Without violating encapsulation, capture and externalize an objects internal state so that the object can
3、be restored to this state later.www.ChinaSA.info備忘錄模式概述備忘錄模式的定義別名為別名為標記標記(Token)模式模式提供了一種提供了一種狀態恢復狀態恢復的實現機制,使得用戶可的實現機制,使得用戶可以方便地以方便地回到一個特定的歷史步驟回到一個特定的歷史步驟當前在很多軟件所提供的撤銷(Undo)操作中就使用了備忘錄模式www.ChinaSA.info備忘錄模式的結構與實現備忘錄模式的結構www.ChinaSA.info備忘錄模式的結構與實現備忘錄模式的結構備忘錄模式包含以下備忘錄模式包含以下3個角色:個角色:Originator(原發器)Mem
4、ento(備忘錄)Caretaker(負責人)www.ChinaSA.info備忘錄模式不同角色的作用原發器原發器:記錄當前時刻的內部狀態,負責定義哪些屬于備份范圍的狀態,負責創建和恢復備忘錄數據。備忘錄備忘錄:負責存儲原發器對象的內部狀態,在需要的時候提供原發器需要的內部狀態。負責人負責人:對備忘錄進行管理,保存和提供備忘錄。www.ChinaSA.info備忘錄模式的結構與實現備忘錄模式的實現典型的原發器類代碼:典型的原發器類代碼:原發器原發器 (Originator)namespace MementoSample public class Originator private strin
5、g state; public Originator(string state) this.state = state; / 創建一個備忘錄對象創建一個備忘錄對象 internal Memento CreateMemento() return new Memento(this); / 根據備忘錄對象恢復原發器狀態根據備忘錄對象恢復原發器狀態 internal void RestoreMemento(Memento m) state = m.GetState(); public void SetState(string state) this.state=state; public string
6、 GetState() return this.state; www.ChinaSA.info備忘錄模式的結構與實現備忘錄模式的實現典型的備忘錄類代碼:典型的備忘錄類代碼:namespace MementoSample /備忘錄類,默認可見性,在程序集內可見備忘錄類,默認可見性,在程序集內可見 internal class Memento private string state; internal Memento(Originator o) state = o.GetState(); internal void SetState(string state) this.state = stat
7、e; internal string GetState() return this.state; www.ChinaSA.info備忘錄模式的結構與實現備忘錄模式的實現除了除了Originator類,類,不允許其他類來調用備忘錄類不允許其他類來調用備忘錄類Memento的構造函數與相關方法的構造函數與相關方法如果允許其他類調用如果允許其他類調用SetState()等方法,將導致在備等方法,將導致在備忘錄中保存的歷史狀態發生改變,通過撤銷操作所恢忘錄中保存的歷史狀態發生改變,通過撤銷操作所恢復的狀態就不再是真實的歷史狀態復的狀態就不再是真實的歷史狀態,備忘錄模式也就,備忘錄模式也就失去了本身的意
8、義失去了本身的意義 理想的情況是理想的情況是只允許生成該備忘錄的原發器訪問備忘只允許生成該備忘錄的原發器訪問備忘錄的內部狀態錄的內部狀態www.ChinaSA.info備忘錄模式的結構與實現備忘錄模式的實現Java語言實現:語言實現:將Memento類與Originator類定義在同一個包(package)中來實現封裝,使用默認訪問標識符來定義Memento類,即保證其在包內可見將備忘錄類作為原發器類的內部類,使得只有原發器才可以訪問備忘錄中的數據,其他對象都無法使用備忘錄中的數據www.ChinaSA.info備忘錄模式的結構與實現備忘錄模式的實現 典型的負責人類代碼:典型的負責人類代碼:
9、負責人(負責人(Caretaker)namespace MementoSample public class Caretaker private Memento memento; internal Memento GetMemento() return memento; internal void SetMemento(Memento memento) this.memento = memento; www.ChinaSA.info備忘錄模式的結構與實現備忘錄模式的實現客戶端演示代碼:客戶端演示代碼:class Client public static void main(String arg
10、s) /創建原發器對象創建原發器對象 Originator ori = new Originator(狀態狀態(1); Console.WriteLine(ori.GetState(); /創建負責人對象,保存創建的備忘錄對象創建負責人對象,保存創建的備忘錄對象 Caretaker ct = new Caretaker(); ct.SetMemento(ori.CreateMemento(); ori.SetState(狀態狀態(2); Console.WriteLine(ori.GetState(); /從負責人對象中取出備忘錄對象,實現撤銷從負責人對象中取出備忘錄對象,實現撤銷 ori.R
11、estoreMemento(ct.GetMemento(); Console.WriteLine(ori.GetState(); Console.Read(); OnOffOnwww.ChinaSA.info備忘錄模式的應用實例實例一在Android平臺上運行的觸摸式中國象棋軟件,必須考慮用戶的水平,經常不小心走錯棋;還有些用戶不習慣使用手指在手機屏幕上拖動棋子,常常出現操作失誤,因此該中國象棋軟件要提供“悔棋悔棋”功能,用戶走錯棋或操作失誤后可恢復到前一個步驟。如下圖所示: 中國象棋軟件界面示意圖中國象棋軟件界面示意圖為了實現“悔棋”功能,現使用備忘錄模式來設計該中國象棋軟件。www.Chi
12、naSA.info備忘錄模式的應用實例w 結果及分析通過創建備忘錄對象可以通過創建備忘錄對象可以將象棋棋子的歷史狀態信息將象棋棋子的歷史狀態信息記錄下來記錄下來,在,在“悔棋悔棋”時取出存儲在備忘錄中的歷史時取出存儲在備忘錄中的歷史狀態信息,狀態信息,用歷史狀態來覆蓋當前狀態用歷史狀態來覆蓋當前狀態,從而實現狀,從而實現狀態的撤銷態的撤銷www.ChinaSA.info實現多次撤銷動機有時候用戶需要有時候用戶需要撤銷多步操作撤銷多步操作實現方案:實現方案:在負責人類中在負責人類中定義一個集合定義一個集合來存儲多個備來存儲多個備忘錄,每個備忘錄負責保存一個歷史狀態,忘錄,每個備忘錄負責保存一個歷
13、史狀態,在撤銷時在撤銷時可以對備忘錄集合進行逆向遍歷,回到一個指定的歷可以對備忘錄集合進行逆向遍歷,回到一個指定的歷史狀態史狀態,還可以,還可以對備忘錄集合進行正向遍歷,實現重對備忘錄集合進行正向遍歷,實現重做做(Redo)或恢復操作或恢復操作,即取消撤銷,讓對象狀態得到,即取消撤銷,讓對象狀態得到恢復恢復www.ChinaSA.info實現多次撤銷擴展 本實例只能實現最簡單的本實例只能實現最簡單的Undo和和Redo操作,并未操作,并未考慮對象狀態在操作過程中出現分支的情況。如果在撤銷考慮對象狀態在操作過程中出現分支的情況。如果在撤銷到某個歷史狀態之后,用戶再修改對象狀態,此后執行到某個歷史
14、狀態之后,用戶再修改對象狀態,此后執行Undo操作時可能會發生對象狀態錯誤,大家可以思考其操作時可能會發生對象狀態錯誤,大家可以思考其產生原因。產生原因。【注:可將對象狀態的改變繪制成一張樹狀圖注:可將對象狀態的改變繪制成一張樹狀圖進行分析。進行分析。】 在實際開發中,可以使用鏈表或者堆棧來處理有分支在實際開發中,可以使用鏈表或者堆棧來處理有分支的對象狀態改變,大家可通過鏈表或者堆棧對上述實例進的對象狀態改變,大家可通過鏈表或者堆棧對上述實例進行改進。行改進。www.ChinaSA.info備忘錄模式的優缺點與適用環境模式優點提供了一種狀態恢復的實現機制提供了一種狀態恢復的實現機制,使得用,使得用戶可以方便地回到一個特定的歷史步驟戶可以方便地回到一個特定的歷史步驟實現了對信息的封裝實現了對信息的封裝,一個備忘錄對象是,一個備忘錄對象是一種原發器對象狀態的表示,不會被其他一種原發器對象狀態的表示,不會被其他代碼所改動代碼所改動www.ChinaSA.info備忘錄模式的優缺點與適用環境模式缺點資源消耗過大資源消耗過大,如果需要保存的原發器類的,如果需要保存的原發器類的成員變量太多,就不可避免地需要占用大量成員變量太多,就不可避免地需要占用大量的存儲空間,的存儲空間,每保存一次對象的狀態都需要每保存一次對象的狀態都需要消耗一定的系統資源消耗一
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025下半年電新行業供給回歸有序需求韌性較好靜待周期復蘇
- 直播電商主播在2025年的粉絲互動與營銷策略研究報告
- 老年教育課程設置改革與2025年體驗式教學方法應用分析報告
- 2025年農村一二三產業融合發展的農村電商與農業品牌建設報告
- 2025年文化旅游演藝項目季節性運營與市場策略報告
- 2025年成人教育終身學習平臺運營中的品牌建設與市場推廣報告
- 汽車輕量化材料在汽車底盤減重中的技術創新報告
- 汽車行業2025年供應鏈風險管理與企業風險管理策略優化方案報告
- 汽車共享平臺2025年運營模式轉型與用戶行為重構報告
- 2025年遠程醫療服務在分級診療中的遠程醫療技術與設備研發與創新報告
- T/CIE 208-2024兒童機器人教育評價指南
- 2025年高考英語課后續寫高頻考點話題分類第07講 讀后續寫之成長類主題(講義)
- 2025年廣東中考百校聯考語文試卷 2025年廣東中考百校聯考語文試卷
- 2025年公路市場調研報告
- 五年級(下)語文選擇題專項165道
- 生物+2025云南新高考自主命題沖刺金卷及答案
- 糖尿病眼病試題及答案
- 期末模擬卷(南京專用)(含解析)2024-2025學年譯林版英語七年級下冊
- 石油化工工程防滲技術規范
- 25年企業員工崗前安全培訓考試試題【模擬題】
- 高中語文跨學科閱讀教學研究-以《紅樓夢》為例
評論
0/150
提交評論