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

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

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

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

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

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

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

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


? ? ? ? 相信上邊的場景大家都不陌生吧,僅僅因為忘了備忘,不僅使我們的成功后的喜悅瞬間煙消云散,還使得我們不得不重新再做一遍,心情瞬間就不美了。那么如何有效的避免上述場景的出現(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)圖



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

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)入并實例化出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的實現(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)點:當(dāng)發(fā)起人角色中的狀態(tài)改變時,有可能這是個錯誤的改變,我們使用備忘錄模式就可以把這個錯誤的改變還原。

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

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

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

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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容