軟件開發(fā)模式:備忘錄模式_第1頁
軟件開發(fā)模式:備忘錄模式_第2頁
軟件開發(fā)模式:備忘錄模式_第3頁
軟件開發(fā)模式:備忘錄模式_第4頁
軟件開發(fā)模式:備忘錄模式_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、www.ChinaSA.infoDesign Patterns備忘錄模式*www.ChinaSA.info大綱備忘錄模式概述備忘錄模式的結(jié)構(gòu)與實現(xiàn)備忘錄模式的應(yīng)用實例備忘錄模式的優(yōu)缺點與適用環(huán)境www.ChinaSA.info備忘錄模式概述備忘錄模式軟件中的“后悔藥”撤銷(Undo)www.ChinaSA.info備忘錄模式概述分析通過使用備忘錄模式可以通過使用備忘錄模式可以讓系統(tǒng)讓系統(tǒng)恢復(fù)到某一特定的歷史狀態(tài)恢復(fù)到某一特定的歷史狀態(tài)首先首先保存軟件系統(tǒng)的歷史狀態(tài)保存軟件系統(tǒng)的歷史狀態(tài),當(dāng)用戶需要取消錯誤操作并且返當(dāng)用戶需要取消錯誤操作并且返回到某個歷史狀態(tài)時,可以回到某個歷史狀態(tài)時,可以取出

2、取出事先保存的歷史狀態(tài)來覆蓋當(dāng)前事先保存的歷史狀態(tài)來覆蓋當(dāng)前狀態(tài)狀態(tài)www.ChinaSA.info備忘錄模式概述備忘錄模式的定義對象行為型對象行為型模式模式備忘錄模式備忘錄模式:在不破壞封裝的前提下在不破壞封裝的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài),這樣就可以在以后將對象恢復(fù)到原先保存的狀態(tài)可以在以后將對象恢復(fù)到原先保存的狀態(tài)。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備忘錄模式概述備忘錄模式的定義別名為別名為標(biāo)記標(biāo)記(Token)模式模式提供了一種提供了一種狀態(tài)恢復(fù)狀態(tài)恢復(fù)的實現(xiàn)機(jī)制,使得用戶可的實現(xiàn)機(jī)制,使得用戶可以方便地以方便地回到一個特定的歷史步驟回到一個特定的歷史步驟當(dāng)前在很多軟件所提供的撤銷(Undo)操作中就使用了備忘錄模式www.ChinaSA.info備忘錄模式的結(jié)構(gòu)與實現(xiàn)備忘錄模式的結(jié)構(gòu)www.ChinaSA.info備忘錄模式的結(jié)構(gòu)與實現(xiàn)備忘錄模式的結(jié)構(gòu)備忘錄模式包含以下備忘錄模式包含以下3個角色:個角色:Originator(原發(fā)器)Mem

4、ento(備忘錄)Caretaker(負(fù)責(zé)人)www.ChinaSA.info備忘錄模式不同角色的作用原發(fā)器原發(fā)器:記錄當(dāng)前時刻的內(nèi)部狀態(tài),負(fù)責(zé)定義哪些屬于備份范圍的狀態(tài),負(fù)責(zé)創(chuàng)建和恢復(fù)備忘錄數(shù)據(jù)。備忘錄備忘錄:負(fù)責(zé)存儲原發(fā)器對象的內(nèi)部狀態(tài),在需要的時候提供原發(fā)器需要的內(nèi)部狀態(tài)。負(fù)責(zé)人負(fù)責(zé)人:對備忘錄進(jìn)行管理,保存和提供備忘錄。www.ChinaSA.info備忘錄模式的結(jié)構(gòu)與實現(xiàn)備忘錄模式的實現(xiàn)典型的原發(fā)器類代碼:典型的原發(fā)器類代碼:原發(fā)器原發(fā)器 (Originator)namespace MementoSample public class Originator private strin

5、g state; public Originator(string state) this.state = state; / 創(chuàng)建一個備忘錄對象創(chuàng)建一個備忘錄對象 internal Memento CreateMemento() return new Memento(this); / 根據(jù)備忘錄對象恢復(fù)原發(fā)器狀態(tài)根據(jù)備忘錄對象恢復(fù)原發(fā)器狀態(tài) 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備忘錄模式的結(jié)構(gòu)與實現(xiàn)備忘錄模式的實現(xiàn)典型的備忘錄類代碼:典型的備忘錄類代碼:namespace MementoSample /備忘錄類,默認(rèn)可見性,在程序集內(nèi)可見備忘錄類,默認(rèn)可見性,在程序集內(nèi)可見 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備忘錄模式的結(jié)構(gòu)與實現(xiàn)備忘錄模式的實現(xiàn)除了除了Originator類,類,不允許其他類來調(diào)用備忘錄類不允許其他類來調(diào)用備忘錄類Memento的構(gòu)造函數(shù)與相關(guān)方法的構(gòu)造函數(shù)與相關(guān)方法如果允許其他類調(diào)用如果允許其他類調(diào)用SetState()等方法,將導(dǎo)致在備等方法,將導(dǎo)致在備忘錄中保存的歷史狀態(tài)發(fā)生改變,通過撤銷操作所恢忘錄中保存的歷史狀態(tài)發(fā)生改變,通過撤銷操作所恢復(fù)的狀態(tài)就不再是真實的歷史狀態(tài)復(fù)的狀態(tài)就不再是真實的歷史狀態(tài),備忘錄模式也就,備忘錄模式也就失去了本身的意

8、義失去了本身的意義 理想的情況是理想的情況是只允許生成該備忘錄的原發(fā)器訪問備忘只允許生成該備忘錄的原發(fā)器訪問備忘錄的內(nèi)部狀態(tài)錄的內(nèi)部狀態(tài)www.ChinaSA.info備忘錄模式的結(jié)構(gòu)與實現(xiàn)備忘錄模式的實現(xiàn)Java語言實現(xiàn):語言實現(xiàn):將Memento類與Originator類定義在同一個包(package)中來實現(xiàn)封裝,使用默認(rèn)訪問標(biāo)識符來定義Memento類,即保證其在包內(nèi)可見將備忘錄類作為原發(fā)器類的內(nèi)部類,使得只有原發(fā)器才可以訪問備忘錄中的數(shù)據(jù),其他對象都無法使用備忘錄中的數(shù)據(jù)www.ChinaSA.info備忘錄模式的結(jié)構(gòu)與實現(xiàn)備忘錄模式的實現(xiàn) 典型的負(fù)責(zé)人類代碼:典型的負(fù)責(zé)人類代碼:

9、負(fù)責(zé)人(負(fù)責(zé)人(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備忘錄模式的結(jié)構(gòu)與實現(xiàn)備忘錄模式的實現(xiàn)客戶端演示代碼:客戶端演示代碼:class Client public static void main(String arg

10、s) /創(chuàng)建原發(fā)器對象創(chuàng)建原發(fā)器對象 Originator ori = new Originator(狀態(tài)狀態(tài)(1); Console.WriteLine(ori.GetState(); /創(chuàng)建負(fù)責(zé)人對象,保存創(chuàng)建的備忘錄對象創(chuàng)建負(fù)責(zé)人對象,保存創(chuàng)建的備忘錄對象 Caretaker ct = new Caretaker(); ct.SetMemento(ori.CreateMemento(); ori.SetState(狀態(tài)狀態(tài)(2); Console.WriteLine(ori.GetState(); /從負(fù)責(zé)人對象中取出備忘錄對象,實現(xiàn)撤銷從負(fù)責(zé)人對象中取出備忘錄對象,實現(xiàn)撤銷 ori.R

11、estoreMemento(ct.GetMemento(); Console.WriteLine(ori.GetState(); Console.Read(); OnOffOnwww.ChinaSA.info備忘錄模式的應(yīng)用實例實例一在Android平臺上運行的觸摸式中國象棋軟件,必須考慮用戶的水平,經(jīng)常不小心走錯棋;還有些用戶不習(xí)慣使用手指在手機(jī)屏幕上拖動棋子,常常出現(xiàn)操作失誤,因此該中國象棋軟件要提供“悔棋悔棋”功能,用戶走錯棋或操作失誤后可恢復(fù)到前一個步驟。如下圖所示: 中國象棋軟件界面示意圖中國象棋軟件界面示意圖為了實現(xiàn)“悔棋”功能,現(xiàn)使用備忘錄模式來設(shè)計該中國象棋軟件。www.Chi

12、naSA.info備忘錄模式的應(yīng)用實例w 結(jié)果及分析通過創(chuàng)建備忘錄對象可以通過創(chuàng)建備忘錄對象可以將象棋棋子的歷史狀態(tài)信息將象棋棋子的歷史狀態(tài)信息記錄下來記錄下來,在,在“悔棋悔棋”時取出存儲在備忘錄中的歷史時取出存儲在備忘錄中的歷史狀態(tài)信息,狀態(tài)信息,用歷史狀態(tài)來覆蓋當(dāng)前狀態(tài)用歷史狀態(tài)來覆蓋當(dāng)前狀態(tài),從而實現(xiàn)狀,從而實現(xiàn)狀態(tài)的撤銷態(tài)的撤銷www.ChinaSA.info實現(xiàn)多次撤銷動機(jī)有時候用戶需要有時候用戶需要撤銷多步操作撤銷多步操作實現(xiàn)方案:實現(xiàn)方案:在負(fù)責(zé)人類中在負(fù)責(zé)人類中定義一個集合定義一個集合來存儲多個備來存儲多個備忘錄,每個備忘錄負(fù)責(zé)保存一個歷史狀態(tài),忘錄,每個備忘錄負(fù)責(zé)保存一個歷

13、史狀態(tài),在撤銷時在撤銷時可以對備忘錄集合進(jìn)行逆向遍歷,回到一個指定的歷可以對備忘錄集合進(jìn)行逆向遍歷,回到一個指定的歷史狀態(tài)史狀態(tài),還可以,還可以對備忘錄集合進(jìn)行正向遍歷,實現(xiàn)重對備忘錄集合進(jìn)行正向遍歷,實現(xiàn)重做做(Redo)或恢復(fù)操作或恢復(fù)操作,即取消撤銷,讓對象狀態(tài)得到,即取消撤銷,讓對象狀態(tài)得到恢復(fù)恢復(fù)www.ChinaSA.info實現(xiàn)多次撤銷擴(kuò)展 本實例只能實現(xiàn)最簡單的本實例只能實現(xiàn)最簡單的Undo和和Redo操作,并未操作,并未考慮對象狀態(tài)在操作過程中出現(xiàn)分支的情況。如果在撤銷考慮對象狀態(tài)在操作過程中出現(xiàn)分支的情況。如果在撤銷到某個歷史狀態(tài)之后,用戶再修改對象狀態(tài),此后執(zhí)行到某個歷史

14、狀態(tài)之后,用戶再修改對象狀態(tài),此后執(zhí)行Undo操作時可能會發(fā)生對象狀態(tài)錯誤,大家可以思考其操作時可能會發(fā)生對象狀態(tài)錯誤,大家可以思考其產(chǎn)生原因。產(chǎn)生原因。【注:可將對象狀態(tài)的改變繪制成一張樹狀圖注:可將對象狀態(tài)的改變繪制成一張樹狀圖進(jìn)行分析。進(jìn)行分析。】 在實際開發(fā)中,可以使用鏈表或者堆棧來處理有分支在實際開發(fā)中,可以使用鏈表或者堆棧來處理有分支的對象狀態(tài)改變,大家可通過鏈表或者堆棧對上述實例進(jìn)的對象狀態(tài)改變,大家可通過鏈表或者堆棧對上述實例進(jìn)行改進(jìn)。行改進(jìn)。www.ChinaSA.info備忘錄模式的優(yōu)缺點與適用環(huán)境模式優(yōu)點提供了一種狀態(tài)恢復(fù)的實現(xiàn)機(jī)制提供了一種狀態(tài)恢復(fù)的實現(xiàn)機(jī)制,使得用,使得用戶可以方便地回到一個特定的歷史步驟戶可以方便地回到一個特定的歷史步驟實現(xiàn)了對信息的封裝實現(xiàn)了對信息的封裝,一個備忘錄對象是,一個備忘錄對象是一種原發(fā)器對象狀態(tài)的表示,不會被其他一種原發(fā)器對象狀態(tài)的表示,不會被其他代碼所改動代碼所改動www.ChinaSA.info備忘錄模式的優(yōu)缺點與適用環(huán)境模式缺點資源消耗過大資源消耗過大,如果需要保存的原發(fā)器類的,如果需要保存的原發(fā)器類的成員變量太多,就不可避免地需要占用大量成員變量太多,就不可避免地需要占用大量的存儲空間,的存儲空間,每保存一次對象的狀態(tài)都需要每保存一次對象的狀態(tài)都需要消耗一定的系統(tǒng)資源消耗一

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論