




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、23種設(shè)計(jì)模式(15):備忘錄模式-編程開(kāi)發(fā)技術(shù)23種設(shè)計(jì)模式(15):備忘錄模式原文出處:卡奴達(dá)摩的專欄定義:在不破壞封裝性的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保 存這個(gè)狀態(tài)。這樣就可以將該對(duì)象恢復(fù)到原先保存的狀態(tài)類型:行為類< < 發(fā)起人 > > originator類圖:+setmemento()+creatememento()我們?cè)诰幊痰臅r(shí)候,經(jīng)常需要保存對(duì)象的小間狀態(tài),當(dāng)需耍的時(shí)候,可以恢復(fù)到 這個(gè)狀態(tài)。比如,我們使用eclipse進(jìn)行編程時(shí),假如編寫(xiě)失誤(例如不小心誤 刪除了兒行代碼),我們希望返回刪除前的狀態(tài),便可以使用ctm+z來(lái)進(jìn)行返 回。
2、這時(shí)我們便可以使用備忘錄模式來(lái)實(shí)現(xiàn)。備忘錄模式的結(jié)構(gòu)發(fā)起人:記錄當(dāng)前時(shí)刻的內(nèi)部狀態(tài),負(fù)責(zé)定義哪些屬于備份范圍的狀態(tài),負(fù)責(zé)創(chuàng)建 和恢復(fù)備忘錄數(shù)據(jù)。備忘錄:負(fù)責(zé)存儲(chǔ)發(fā)起人對(duì)象的內(nèi)部狀態(tài),在需要的時(shí)候提供發(fā)起人需要的內(nèi)部狀 態(tài)。管理角色:對(duì)備忘錄進(jìn)行管理,保存和提供備忘錄。通用代碼實(shí)現(xiàn)class originator private string state ="”; public string getstate() return state;public void setstate(string state) this, state 二 state;public memento crea
3、tememento() return new memento(this. state);public void restorememcnto(memento memento) this. setstate (memento. getstateo);class memento private string state = ”;public memento(string state)this, state 二 state;public string gctstatc() return state;public void setstate(string state) this. state = st
4、ate;class caretaker private memento memento;public memento getmemento() return memento;public void setmemento(memento memento)this, memento 二 memento;public class client public static void main(string args)originator originator 二 new originator(); originator. setstate(狀態(tài) 1); system, out. println(初始狀
5、態(tài):+originator. getstateo);caretaker caretaker = new caretaker (); caretaker. setmemento(originator. creatememento(); originator. setstate (狀態(tài) 2);system, out. println(改變后狀態(tài):+originator. getstateo);originator. restorememento (caretaker. getmementoo); system, out. printin (z,恢復(fù)后狀態(tài):+originator. getstate
6、 ();代碼演示了一個(gè)單狀態(tài)單備份的例子,邏輯非常簡(jiǎn)單:originator類中的state 變量需要備份,以便在需要的時(shí)候恢復(fù);memento類中,也有一個(gè)state變量, 用來(lái)存儲(chǔ)originator類小state變量的臨時(shí)狀態(tài);而caretaker類就是用來(lái)管 理備忘錄類的,用來(lái)向備忘錄對(duì)象中寫(xiě)入狀態(tài)或者取回狀態(tài)。多狀態(tài)多備份備忘錄 通用代碼演示的例子屮,originator類只有一個(gè)state變量需要備份,而通常 情況下,發(fā)起人角色通常是一個(gè)javabean,對(duì)象中需要備份的變量不止一個(gè), 需要備份的狀態(tài)也不止一個(gè),這就是多狀態(tài)多備份備忘錄。實(shí)現(xiàn)備忘錄的方法很 多,備忘錄模式冇很多變形
7、和處理方式,像通用代碼那樣的方式一般不會(huì)用到, 多數(shù)情況下的備忘錄模式,是多狀態(tài)多備份的。其實(shí)實(shí)現(xiàn)多狀態(tài)多備份也很簡(jiǎn)單, 最常用的方法是,我們?cè)趍emento 增加一個(gè)map容器來(lái)存儲(chǔ)所有的狀態(tài),在 caretaker類中同樣使用一個(gè)map容器才存儲(chǔ)所有的備份。下面我們給出一個(gè)多 狀態(tài)多備份的例了:class originator private string statel 二 private string state2 = private string state3 =public string getstatel() retuim statel;public void setstatel
8、(string statel) this .statel = statel;public string getstate2() return state2;public void sctstatc2(string statc2) this. state2 = state2;public string getstate3() return state3;public void sctstatc3(string statc3) this. state3 = state3;public memento creatememento ()return new memento(beanutilsbacku
9、pprop(this); public void restorememento(memento memento) beanutils. restoreprop(this, memento. getstatemapo);public string tostringo return /statel=z'+statel+/state2=z'+state2+/state3=zz+state3; class memcnto private map<string, object> statemap;public memento(map<string, object>
10、 map)this. statemap = map;public map<string, object> getstatemap() return statemap;public void setstatemap(map<string, object> statemap) this. statemap = statemap; class beanut訂s public static map<string, object> backupprop(object bean) map<string, object> result = new hashma
11、p<string, object> ();beanlnfo boanlnfo 二 introspector. getbeanlnfo(bean. getclass();propertydescriptor descriptors = beaninfo. getpropertydescriptors();for (propertydescriptor des: descriptors) string fieldncime = des. getneime(); hethod getter 二 dcs> gctrcadmcthod (); object fieldvalue = g
12、etter, invoke (bean, new object);if(ifieldname. equalsignorecase(class) resuit.put (ficldnamc,f ieldvalue);catch(exception e) e. printstacktrace ();return resuit;public static void restoreprop (object bean, map<string, object> propmap)try beaninfo beaninfo 二introspector getbeanlnfo(bean. getcl
13、ass();propertydescriptor descriptors 二beantnfo. getpropertydescriptors();for (propertydcscriptor des: dcscriptors) string fieldname = des. getname(); if(propmap. containskey(fieldname) method setter 二 des. etwritemethod();sett er. inv okc(bcei n, newobjectpropmap. get(fieldname); catch (exception e)
14、 c. printstacktrace ();class caretaker privatc map<string, memento> memmap 二 new iiashmap<string, memento> ();public memento getmemento(string index) return memmap. get (index);public void setmemcnto(string index, memento memento) this. memmap. put(index, memento);class client public sta
15、tic void main(string args) originator ori = new originator(); caretaker caretaker = new caretaker(); ori. setstatel (中國(guó));ori. setstate2(/z強(qiáng)盛);ori. setstate3(z/繁榮);system, out. printin c=二二初始化狀態(tài)二二二n+ori);caretaker setmcmcnto(zz001z,, ori. creatcmcmcnto(); ori. setstatel ("軟件");ori. setstate2(z,架構(gòu));ori. setstate3(z/優(yōu)秀);system, out. print in (二二二修改后狀態(tài)二二二n+ori);ori. restorememento(caretaker getmemento(001); system, out. printin ("二二二恢復(fù)后狀態(tài)二二二rt+
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 塑料管生產(chǎn)項(xiàng)目可行性研究報(bào)告
- 2025年中國(guó)海底電纜行業(yè)市場(chǎng)供需格局及投資前景展望報(bào)告
- 2025年度新型城鎮(zhèn)化項(xiàng)目勞務(wù)分包管理合同
- 《金色的草地》教學(xué)設(shè)計(jì)-2024-2025學(xué)年語(yǔ)文三年級(jí)上冊(cè)(統(tǒng)編版)
- 2025年度高性能沙子研發(fā)與市場(chǎng)推廣合同4篇
- 2025年度人參產(chǎn)業(yè)鏈信息化建設(shè)合同4篇
- 2025年龍門(mén)式掛鍍線項(xiàng)目投資可行性研究分析報(bào)告
- 《分?jǐn)?shù)的基本性質(zhì)》第二課時(shí)(教學(xué)設(shè)計(jì))-2023-2024學(xué)年五年級(jí)下冊(cè)數(shù)學(xué)西師大版
- 碳化硅棚塊行業(yè)行業(yè)發(fā)展趨勢(shì)及投資戰(zhàn)略研究分析報(bào)告
- 2025年草原牧民職業(yè)技能培訓(xùn)合作協(xié)議范本
- 2024年湖南高速鐵路職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)附答案
- (完整)低壓配電柜技術(shù)規(guī)范
- 《通信原理》樊昌信曹麗娜編著第六版課件
- 《書(shū)籍裝幀設(shè)計(jì)》 課件 項(xiàng)目2 書(shū)籍裝幀設(shè)計(jì)要素
- 妊娠期合并癥婦女的護(hù)理-妊娠合并心臟病的護(hù)理(婦產(chǎn)科護(hù)理課件)4EX
- 中職語(yǔ)文高教版基礎(chǔ)模塊上冊(cè)《風(fēng)景談》公開(kāi)課一等獎(jiǎng)創(chuàng)新教學(xué)設(shè)計(jì)
- 汪小蘭有機(jī)化學(xué)課件第四版
- Unit1 My day 單元作業(yè)設(shè)計(jì)(素材)人教PEP版英語(yǔ)五年級(jí)下冊(cè)
- 贏的思考與態(tài)度課件
- 2024年2月國(guó)考海關(guān)面試題目及參考答案
- TZSA 158-2023 雙引擎分布式視頻處理器技術(shù)規(guī)范
評(píng)論
0/150
提交評(píng)論