淺談 java 設(shè)計模式之 備忘錄模式

? ?“臥槽荚藻!”,小A一聲極其粗魯?shù)呐R瞬間打破了公司午后的寧靜阵难。

? ? “你這是怎么了?”芒填,號稱公司“八卦第一人”的小B瞬間到達(dá)了戰(zhàn)場呜叫。

? ? “這兩天我不是一直在找x項(xiàng)目中的bug嗎空繁,就在剛才,還沒來得及體會找到bug的喜悅朱庆,電腦死機(jī)了盛泡!”小A憤憤的說到。

? ? “ 那你再重新找一下不就行了娱颊“了校”,小C一臉輕松地走過來箱硕。

? ? “可是我的數(shù)據(jù)都還沒有備份拴竹,原本想等到找到之后再備份,結(jié)果電腦死機(jī)了剧罩!”小A有氣無力的應(yīng)著栓拜。

? ? “現(xiàn)在說什么都沒用了,就當(dāng)吃一塹長一智了惠昔,還是盡快再做一遍吧幕与,老大不就給了你三天時間嗎?”镇防,小D拍了拍小A的肩膀慢慢走遠(yuǎn)了啦鸣。

? ? “唉!”来氧,小A邊嘆氣邊打開了電腦.......


? ? ? ? 相信上邊的場景大家都不陌生吧诫给,僅僅因?yàn)橥藗渫粌H使我們的成功后的喜悅瞬間煙消云散啦扬,還使得我們不得不重新再做一遍蝙搔,心情瞬間就不美了。那么如何有效的避免上述場景的出現(xiàn)呢考传?對吃型,就是將數(shù)據(jù)備份。那么接下來我們就來談?wù)勗贘ava程序設(shè)計中的備份僚楞,也就是我們常說的二十三種設(shè)計模式中的備忘錄模式勤晚。

? ? ? 備忘錄(Memento)模式又稱標(biāo)記(Token)模式。GOF給備忘錄模式的定義為:在不破壞封裝性的前提下泉褐,捕獲一個對象的內(nèi)部狀態(tài)赐写,并在該對象之外保存這個狀態(tài)。這樣以后就可將該對象恢復(fù)到原先保存的狀態(tài)膜赃。

? ? ?備忘錄模式結(jié)構(gòu)圖



其實(shí)從上圖我們便可以看出來備忘錄模式可以說是有三個部分組成:

1. ? ? ?發(fā)起者角色(Originator):負(fù)責(zé)創(chuàng)建一個備忘錄用以記錄當(dāng)前時刻它的內(nèi)部狀態(tài)挺邀,并可以使用備忘錄恢復(fù)內(nèi)部狀態(tài)。

2. ? ? ? 備忘錄角色(Memento):負(fù)責(zé)存儲Originator對象的內(nèi)部狀態(tài),并可以防止Originator以外的其他對象訪問備忘錄端铛。

3. ? ? ? ?管理者角色(Manager):負(fù)責(zé)保存好備忘錄泣矛。

? 讀到這里相信大家對備忘錄已經(jīng)有一定的理解了,再來看一段代碼:

代碼示例?:

Originator(發(fā)起人類)

public class Originator{

? ? ? ? privateString state;//需要保存的屬性

????// 創(chuàng)建備忘錄禾蚕,將需要保存的信息導(dǎo)入并實(shí)例化出Memento對象

public Memento create Memento(){

return new Memento(state);

}

//恢復(fù)備忘錄您朽,將memento導(dǎo)入并恢復(fù)相關(guān)數(shù)據(jù)

?public void setMemento(Memento memento){

?state = memento.getState();

?}

// 顯示數(shù)據(jù)

public void show(){

System.out.println("state="+state);

}

}

Menmento(備忘錄):

public class Memento{

private String state;

public Memento(String state){

this.state = state;

}

}

Manager(管理者):

public class Manager{

private Memento memento;

}

客戶端

public class Memo{

public static void main(String[] args){

//初始狀態(tài)為on

Originator o = new Originator();

o.setState("on");

o.show();

//保存狀態(tài),隱藏了Originator的實(shí)現(xiàn)細(xì)節(jié)

Manager?c = new Manager();

c.setMemento(o.createMemento());

o.setState("off");

o.show();

//恢復(fù)狀態(tài)

o.setMemento(c.getMemento());

o.show();

}

}

看完有沒有發(fā)現(xiàn)這種模式的優(yōu)點(diǎn):當(dāng)發(fā)起人角色中的狀態(tài)改變時换淆,有可能這是個錯誤的改變哗总,我們使用備忘錄模式就可以把這個錯誤的改變還原。

備份的狀態(tài)是保存在發(fā)起人角色之外的倍试,這樣讯屈,發(fā)起人角色就不需要對各個備份的狀態(tài)進(jìn)行管理。

不過萬事萬物皆有兩面性县习,細(xì)心的讀者肯定也發(fā)現(xiàn)了它的不足耻煤,在實(shí)際應(yīng)用中,備忘錄模式都是多狀態(tài)和多備份的准颓,發(fā)起人角色的狀態(tài)需要存儲到備忘錄對象中,對資源的消耗是比較嚴(yán)重的棺妓。

如果有需要提供回滾操作的需求攘已,使用備忘錄模式非常適合,比如jdbc的事務(wù)操作怜跑,文本編輯器的Ctrl+Z恢復(fù)等样勃。

? 以上便是本人對備忘錄設(shè)計模式的理解了,希望對大家有所幫助性芬,如果有什么不足之處還希望大家多多指點(diǎn)峡眶,感激不盡!

版權(quán)聲明:本文為博主原創(chuàng)文章植锉,未經(jīng)博主允許不得轉(zhuǎn)載辫樱。http://www.reibang.com/writer#/notebooks/28204711/notes/32165896

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市俊庇,隨后出現(xiàn)的幾起案子狮暑,更是在濱河造成了極大的恐慌,老刑警劉巖辉饱,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搬男,死亡現(xiàn)場離奇詭異,居然都是意外死亡彭沼,警方通過查閱死者的電腦和手機(jī)缔逛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人褐奴,你說我怎么就攤上這事按脚。” “怎么了歉糜?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵乘寒,是天一觀的道長。 經(jīng)常有香客問我匪补,道長伞辛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任夯缺,我火速辦了婚禮蚤氏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘踊兜。我一直安慰自己竿滨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布捏境。 她就那樣靜靜地躺著于游,像睡著了一般。 火紅的嫁衣襯著肌膚如雪垫言。 梳的紋絲不亂的頭發(fā)上茧泪,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天巍举,我揣著相機(jī)與錄音艘刚,去河邊找鬼速勇。 笑死,一個胖子當(dāng)著我的面吹牛凛捏,可吹牛的內(nèi)容都是我干的担忧。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼坯癣,長吁一口氣:“原來是場噩夢啊……” “哼瓶盛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起示罗,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤蓬网,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鹉勒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帆锋,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年禽额,在試婚紗的時候發(fā)現(xiàn)自己被綠了锯厢。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片皮官。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖实辑,靈堂內(nèi)的尸體忽然破棺而出捺氢,到底是詐尸還是另有隱情,我是刑警寧澤剪撬,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布摄乒,位于F島的核電站,受9級特大地震影響残黑,放射性物質(zhì)發(fā)生泄漏馍佑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一梨水、第九天 我趴在偏房一處隱蔽的房頂上張望拭荤。 院中可真熱鬧,春花似錦疫诽、人聲如沸舅世。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽雏亚。三九已至,卻和暖如春摩钙,著一層夾襖步出監(jiān)牢的瞬間罢低,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工腺律, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宜肉。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓匀钧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親谬返。 傳聞我的和親對象是個殘疾皇子之斯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容