? ?“臥槽荚藻!”,小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