備忘錄模式顧秀堅(jiān)123_第1頁
備忘錄模式顧秀堅(jiān)123_第2頁
備忘錄模式顧秀堅(jiān)123_第3頁
備忘錄模式顧秀堅(jiān)123_第4頁
備忘錄模式顧秀堅(jiān)123_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

備忘錄模式顧秀堅(jiān)目錄定義涉及角色模式分析實(shí)例與解析模式的優(yōu)缺點(diǎn)模式應(yīng)用本章小結(jié)定義備忘錄模式(MementoPattern)又叫做快照模式(SnapshotPattern)或Token模式,是GoF的23種設(shè)計(jì)模式之一,屬于行為模式。在不破壞封閉的前提下,捕獲一個(gè)對象的內(nèi)部狀態(tài),并在該對象之外保存這個(gè)狀態(tài)。這樣以后就可將該對象恢復(fù)到原先保存的狀態(tài)。涉及角色1.Originator(發(fā)起人):負(fù)責(zé)創(chuàng)建一個(gè)備忘錄Memento,用以記錄當(dāng)前時(shí)刻自身的內(nèi)部狀態(tài),并可使用備忘錄恢復(fù)內(nèi)部狀態(tài)。Originator可以根據(jù)需要決定Memento存儲自己的哪些內(nèi)部狀態(tài)。2.Memento(備忘錄):負(fù)責(zé)存儲Originator對象的內(nèi)部狀態(tài),并可以防止Originator以外的其他對象訪問備忘錄。備忘錄有兩個(gè)接口:Caretaker只能看到備忘錄的窄接口,他只能將備忘錄傳遞給其他對象。Originator卻可看到備忘錄的寬接口,允許它訪問返回到先前狀態(tài)所需要的所有數(shù)據(jù)。3.Caretaker(管理者):負(fù)責(zé)備忘錄Memento,不能對Memento的內(nèi)容進(jìn)行訪問或者操作。涉及角色模式分析由于在備忘錄中存儲的是原發(fā)器的中間狀態(tài),因此需要防止原發(fā)器以外的其他對象訪問備忘錄。備忘錄對象通常封裝了原發(fā)器的部分或所有的狀態(tài)信息,而且這些狀態(tài)不能被其他對象訪問,也就是說不能在備忘錄對象之外保存原發(fā)器狀態(tài),因?yàn)楸┞镀鋬?nèi)部狀態(tài)將違反封裝的原則,可能有損系統(tǒng)的可靠性和可擴(kuò)展性。模式分析為了實(shí)現(xiàn)對備忘錄對象的封裝,需要對備忘錄的調(diào)用進(jìn)行控制:對于原發(fā)器而言,它可以調(diào)用備忘錄的所有信息,允許原發(fā)器訪問返回到先前狀態(tài)所需的所有數(shù)據(jù);對于負(fù)責(zé)人而言,只負(fù)責(zé)備忘錄的保存并將備忘錄傳遞給其他對象;對于其他對象而言,只需要從負(fù)責(zé)人處取出備忘錄對象并將原發(fā)器對象的狀態(tài)恢復(fù),而無須關(guān)心備忘錄的保存細(xì)節(jié)。理想的情況是只允許生成該備忘錄的那個(gè)原發(fā)器訪問備忘錄的內(nèi)部狀態(tài)。實(shí)例與解析發(fā)起人角色源代碼publicclassOriginator{privateList<String>states;privateintindex;publicOriginator(){states=newArrayList<String>();index=0;}publicMementocreateMemento(){returnnewMemento(states,index);}publicvoidrestoreMemento(Mementomemento){states=memento.getStates();

案例與分析

index=memento.getIndex();}publicvoidsetState(Stringstate){states.add(state);index++;}publicvoidprintStates(){

for(Stringstate:states){System.out.println(state);}}}案例與分析備忘錄角色類publicclassMemento{privateList<String>states;privateintindex;publicMemento(List<String>states,intindex){this.states=newArrayList<String>(states);this.index=index;}publicList<String>getStates(){returnstates;}publicintgetIndex(){returnindex;}}案例與分析負(fù)責(zé)人角色類publicclassCaretaker{privateOriginatoro;privateList<Memento>mementos=newArrayList<Memento>();privateintcurrent;publicCaretaker(Originatoro){this.o=o;current=0;}publicintcreateMemento(){Mementomemento=o.createMemento();案例與分析

mementos.add(memento);returncurrent++;}publicvoidrestoreMemento(intindex){Mementomemento=mementos.get(index);o.restoreMemento(memento);}publicvoidremoveMemento(intindex){mementos.remove(index);}}案例與分析客戶端角色源代碼publicclassClient{publicstaticvoidmain(String[]args){Originatoro=newOriginator();Caretakerc=newCaretaker(o);o.setState("state0");c.createMemento();o.setState("state1");c.createMemento();o.setState("state2");

案例與分析

c.createMemento();o.setState("state3");c.createMemento();o.printStates();System.out.println("-----------------恢復(fù)檢查點(diǎn)-----------------");c.restoreMemento(2);o.printStates();}}案例與分析運(yùn)行結(jié)果模式的優(yōu)缺點(diǎn)備忘錄模式的優(yōu)點(diǎn)1、有時(shí)一些發(fā)起人對象的內(nèi)部信息必須保存在發(fā)起人對象以外的地方,但是必須要由發(fā)起人對象自己讀取,這時(shí),使用備忘錄模式可以把復(fù)雜的發(fā)起人內(nèi)部信息對其他的對象屏蔽起來,從而可以恰當(dāng)?shù)乇3址庋b的邊界。2、本模式簡化了發(fā)起人類。發(fā)起人不再需要管理和保存其內(nèi)部狀態(tài)的一個(gè)個(gè)版本,客戶端可以自行管理他們所需要的這些狀態(tài)的版本。3、當(dāng)發(fā)起人角色的狀態(tài)改變的時(shí)候,有可能這個(gè)狀態(tài)無效,這時(shí)候就可以使用暫時(shí)存儲起來的備忘錄將狀態(tài)復(fù)原。模式的優(yōu)缺點(diǎn)備忘錄模式的缺點(diǎn)1、如果發(fā)起人角色的狀態(tài)需要完整地存儲到備忘錄對象中,那么在資源消耗上面?zhèn)渫泴ο髸馨嘿F。2、當(dāng)負(fù)責(zé)人角色將一個(gè)備忘錄存儲起來的時(shí)候,負(fù)責(zé)人可能并不知道這個(gè)狀態(tài)會占用多大的存儲空間,從而無法提醒用戶一個(gè)操作是否很昂貴。3、當(dāng)發(fā)起人角色的狀態(tài)改變的時(shí)候,有可能這個(gè)協(xié)議無效。如果狀態(tài)改變的成功率不高的話,不如采取“假如”協(xié)議模式。模式應(yīng)用幾乎所有的文字或者圖像編輯軟件都提供了撤銷(Ctrl+Z)的功能,即撤銷操作,但是當(dāng)軟件關(guān)閉再打開時(shí)不能再進(jìn)行撤銷操作,也就是說不能再回到關(guān)閉軟件前的狀態(tài),實(shí)際上這中間就使用到了備忘錄模式,在編輯文件的同時(shí)可以保存一些內(nèi)部狀態(tài),這些狀態(tài)在軟件關(guān)閉時(shí)從內(nèi)存銷毀,當(dāng)然這些狀態(tài)的保存也不是無限的,很多軟件只提供有限次的撤銷操作。數(shù)據(jù)庫管理系統(tǒng)DBMS所提供的事務(wù)管理應(yīng)用了備忘錄模式,當(dāng)數(shù)據(jù)庫某事務(wù)中一條數(shù)據(jù)操作語句執(zhí)行失敗時(shí),整個(gè)事務(wù)將進(jìn)行回滾操作,系統(tǒng)回到事務(wù)執(zhí)行之前的狀態(tài)。本章小結(jié)備忘錄對象通常封裝了原發(fā)器的部分或所有的狀態(tài)信息,而且這些狀態(tài)不能被其他對象訪問,也就是說不能在該對象之外保存其狀態(tài),因?yàn)楸┞镀鋬?nèi)部狀態(tài)將違反封裝的原則,可能有損系統(tǒng)的可靠性和可擴(kuò)展性。備忘錄模式的主要優(yōu)點(diǎn)在于它提供了一種狀態(tài)恢復(fù)的實(shí)現(xiàn)機(jī)制,使得用戶可以方便地回到一個(gè)特定的歷史步驟,還簡化了原發(fā)器對象,備忘錄只保

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論