日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

设计模式读书笔记-----备忘录模式

發(fā)布時(shí)間:2023/12/1 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式读书笔记-----备忘录模式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ? ? ?個(gè)人比較喜歡玩單機(jī)游戲,什么仙劍、古劍、鬼泣、使命召喚、三國無雙等等一系列的游戲我都玩過(現(xiàn)在期待凡人修仙傳),對(duì)于這些游戲除了劇情好、場(chǎng)面大、爽快之外,還可以隨時(shí)存檔,等到下次想玩了又可以從剛開始的位置玩起(貌似現(xiàn)在的游戲都有)。這里的所謂存檔就是將當(dāng)前的狀態(tài)記錄下來,打開存檔的時(shí)候只需要將這些狀態(tài)讀取出來即可。還有我們小時(shí)候期待長大,長大了希望回到小時(shí)候。18歲想長到28歲,到了28想還是18好!!!


? ? ? ?上面所提到的就是“后悔藥”機(jī)制。在我們生活中,做錯(cuò)事了我們都期望可以從新開始,希望這個(gè)世界上有后悔藥可以吃,但現(xiàn)實(shí)是殘酷的,這個(gè)世界是沒有后悔藥可以吃!雖然在現(xiàn)實(shí)社會(huì)中不可以實(shí)現(xiàn),我們可以在軟件的世界里實(shí)現(xiàn)(現(xiàn)在好多軟件有撤銷功能:Ctrl+Z不就是么)。

? ? ? ?在應(yīng)用開發(fā)中,很多時(shí)候我們總是需要記錄一個(gè)對(duì)象的內(nèi)部狀態(tài),這樣做的目的就是為了允許用戶取消不確定或者錯(cuò)誤的操作,能夠恢復(fù)到他原先的狀態(tài),使得他有“后悔藥”可吃。


? ? ? ?備忘錄模式是一種給我們的軟件提供后悔藥的機(jī)制,通過它可以使系統(tǒng)恢復(fù)到某一特定的歷史狀態(tài)。

? ? ? ?一、 模式定義

? ? ? ?所謂備忘錄模式就是在不破壞封裝的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài),這樣可以在以后將對(duì)象恢復(fù)到原先保存的狀態(tài)。

? ? ? ?備忘錄模式將要保存的細(xì)節(jié)給封裝在備忘錄中,就是那天要改變保存的細(xì)節(jié)也不會(huì)影響到客戶端。


? ? ? ?二、 模式結(jié)構(gòu)

? ? ? ?下圖是備忘錄模式的UML結(jié)構(gòu)圖:


? ? ? ?備忘錄模式主要包含入下幾個(gè)角色:

? ? ? ? ??Originator:?原發(fā)器。負(fù)責(zé)創(chuàng)建一個(gè)備忘錄,用以記錄當(dāng)前對(duì)象的內(nèi)部狀態(tài),通過也可以使用它來利用備忘錄恢復(fù)內(nèi)部狀態(tài)。同時(shí)原發(fā)器還可以根據(jù)需要決定Memento存儲(chǔ)Originator的那些內(nèi)部狀態(tài)。

? ? ? ? ??Memento:?備忘錄。用于存儲(chǔ)Originator的內(nèi)部狀態(tài),并且可以防止Originator以外的對(duì)象訪問Memento。在備忘錄Memento中有兩個(gè)接口,其中Caretaker只能看到備忘錄中的窄接口,它只能將備忘錄傳遞給其他對(duì)象。Originator可以看到寬接口,允許它訪問返回到先前狀態(tài)的所有數(shù)據(jù)。

? ? ? ? ??Caretaker:?負(fù)責(zé)人。負(fù)責(zé)保存好備忘錄,不能對(duì)備忘錄的內(nèi)容進(jìn)行操作和訪問,只能夠?qū)渫泜鬟f給其他對(duì)象。

? ? ? ?在備忘錄模式中,最重要的就是備忘錄Memento了。我們都是備忘錄中存儲(chǔ)的就是原發(fā)器的部分或者所有的狀態(tài)信息,而這些狀態(tài)信息是不能夠被其他對(duì)象所訪問了,也就是說我們是不可能在備忘錄之外的對(duì)象來存儲(chǔ)這些狀態(tài)信息,如果暴漏了內(nèi)部狀態(tài)信息就違反了封裝的原則,故備忘錄是除了原發(fā)器外其他對(duì)象都是不可以訪問的。

? ? ? ?所以為了實(shí)現(xiàn)備忘錄模式的封裝,我們需要對(duì)備忘錄的訪問做些控制:

? ? ? ? ??對(duì)原發(fā)器:可以訪問備忘錄里的所有信息。

? ? ? ? ??對(duì)負(fù)責(zé)人:不可以訪問備忘錄里面的數(shù)據(jù),但是他可以保存?zhèn)渫洸⑶铱梢詫渫泜鬟f給其他對(duì)象。

? ? ? ? ??其他對(duì)象:不可訪問也不可以保存,它只負(fù)責(zé)接收從負(fù)責(zé)人那里傳遞過來的備忘錄同時(shí)恢復(fù)原發(fā)器的狀態(tài)。

? ? ? ?所以就備忘錄模式而言理想的情況就是只允許生成該備忘錄的那個(gè)原發(fā)器訪問備忘錄的內(nèi)部狀態(tài)。

? ? ? ?典型的備忘錄代碼如下:

class Memento {private String state;public Memento(Originator o){state = o.state;}public void setState(String state){this.state=state;}public String getState(){return this.state;}   }

? ? ? ?

? ? ? ? ?三、 模式實(shí)現(xiàn)

? ? ? ?實(shí)現(xiàn)場(chǎng)景:我們就以游戲挑戰(zhàn)BOSS為實(shí)現(xiàn)場(chǎng)景,在挑戰(zhàn)BOSS之前,角色的血量、藍(lán)量都是滿值,然后存檔,在大戰(zhàn)BOSS時(shí),由于操作失誤導(dǎo)致血量和藍(lán)量大量損耗,所以只好恢復(fù)到剛剛開始的存檔點(diǎn),繼續(xù)進(jìn)行大戰(zhàn)BOSS了。這里使用備忘錄模式來實(shí)現(xiàn)。UML結(jié)構(gòu)圖如下:


? ? ? ?首先是游戲角色類:Role.java

private int bloodFlow;private int magicPoint;public Role(int bloodFlow,int magicPoint){this.bloodFlow = bloodFlow;this.magicPoint = magicPoint;}public int getBloodFlow() {return bloodFlow;}public void setBloodFlow(int bloodFlow) {this.bloodFlow = bloodFlow;}public int getMagicPoint() {return magicPoint;}public void setMagicPoint(int magicPoint) {this.magicPoint = magicPoint;}/*** @desc 展示角色當(dāng)前狀態(tài)* @return void*/public void display(){System.out.println("用戶當(dāng)前狀態(tài):");System.out.println("血量:" + getBloodFlow() + ";藍(lán)量:" + getMagicPoint());}/*** @desc 保持存檔、當(dāng)前狀態(tài)* @return* @return Memento*/public Memento saveMemento(){return new Memento(getBloodFlow(), getMagicPoint());}/*** @desc 恢復(fù)存檔* @param memento* @return void*/public void restoreMemento(Memento memento){this.bloodFlow = memento.getBloodFlow();this.magicPoint = memento.getMagicPoint();} }

? ? ? ?備忘錄:Memento.java

class Memento {private int bloodFlow;private int magicPoint;public int getBloodFlow() {return bloodFlow;}public void setBloodFlow(int bloodFlow) {this.bloodFlow = bloodFlow;}public int getMagicPoint() {return magicPoint;}public void setMagicPoint(int magicPoint) {this.magicPoint = magicPoint;}public Memento(int bloodFlow,int magicPoint){this.bloodFlow = bloodFlow;this.magicPoint = magicPoint;} }

? ? ? ?負(fù)責(zé)人:Caretaker.java

public class Caretaker {Memento memento;public Memento getMemento() {return memento;}public void setMemento(Memento memento) {this.memento = memento;}}

? ? ? ??客戶端:Client.java

public class Client {public static void main(String[] args) {//打BOSS之前:血、藍(lán)全部滿值Role role = new Role(100, 100);System.out.println("----------大戰(zhàn)BOSS之前----------");role.display();//保持進(jìn)度Caretaker caretaker = new Caretaker();caretaker.memento = role.saveMemento();//大戰(zhàn)BOSS,快come Over了role.setBloodFlow(20);role.setMagicPoint(20);System.out.println("----------大戰(zhàn)BOSS----------");role.display();//恢復(fù)存檔role.restoreMemento(caretaker.getMemento());System.out.println("----------恢復(fù)----------");role.display();} }

? ? ? ?運(yùn)行結(jié)果



? ? ? ?四、 模式的優(yōu)缺點(diǎn)

? ? ? ?優(yōu)點(diǎn)

? ? ? ? ??1、 給用戶提供了一種可以恢復(fù)狀態(tài)的機(jī)制。可以是用戶能夠比較方便地回到某個(gè)歷史的狀態(tài)。

? ? ? ? ??2、 實(shí)現(xiàn)了信息的封裝。使得用戶不需要關(guān)心狀態(tài)的保存細(xì)節(jié)。

? ? ? ?缺點(diǎn)

? ? ? ? ??消耗資源。如果類的成員變量過多,勢(shì)必會(huì)占用比較大的資源,而且每一次保存都會(huì)消耗一定的內(nèi)存。


? ? ? ?五、 模式適用場(chǎng)景

? ? ? ? ?1、 需要保存一個(gè)對(duì)象在某一個(gè)時(shí)刻的狀態(tài)或部分狀態(tài)。

? ? ? ? ?2、 如果用一個(gè)接口來讓其他對(duì)象得到這些狀態(tài),將會(huì)暴露對(duì)象的實(shí)現(xiàn)細(xì)節(jié)并破壞對(duì)象的封裝性,一個(gè)對(duì)象不希望外界直接訪問其內(nèi)部狀態(tài),通過負(fù)責(zé)人可以間接訪問其內(nèi)部狀態(tài)。


? ? ? ?六、 模式總結(jié)

? ? ? ?1、 備忘錄模式可以實(shí)現(xiàn)在不破壞封裝的前提下,捕獲一個(gè)類的內(nèi)部狀態(tài),并且在該對(duì)象之外保存該對(duì)象的狀態(tài),保證該對(duì)象能夠恢復(fù)到歷史的某個(gè)狀態(tài)。

? ? ? ?2、 備忘錄模式實(shí)現(xiàn)了內(nèi)部狀態(tài)的封裝,除了創(chuàng)建它的原發(fā)器之外其他對(duì)象都不能夠訪問它。

? ? ? ?3、 備忘錄模式會(huì)占用較多的內(nèi)存,消耗資源。

轉(zhuǎn)載于:https://www.cnblogs.com/oversea201405/p/3752109.html

總結(jié)

以上是生活随笔為你收集整理的设计模式读书笔记-----备忘录模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。