備忘錄模式用于保存和恢復(fù)對(duì)象的狀態(tài),相信大家看過我前面的拙作就會(huì)想到原型模式也能保存一個(gè)對(duì)象在某一個(gè)時(shí)刻的狀態(tài),那么兩者有何不同的呢?原型模式保存的是當(dāng)前對(duì)象的所有狀態(tài)信息,恢復(fù)的時(shí)候會(huì)生成與保存的對(duì)象完全相同的另外一個(gè)實(shí)例;而備忘錄模式保存的是我們關(guān)心的在恢復(fù)時(shí)需要的對(duì)象的部分狀態(tài)信息,相當(dāng)于快照。備忘錄模式大家肯定都見過,比如在玩游戲的時(shí)候有一個(gè)保存當(dāng)前闖關(guān)的狀態(tài)的功能,會(huì)對(duì)當(dāng)前用戶所處的狀態(tài)進(jìn)行保存,當(dāng)用戶闖關(guān)失敗或者需要從快照的地方開始的時(shí)候,就能讀取當(dāng)時(shí)保存的狀態(tài)完整地恢復(fù)到當(dāng)時(shí)的環(huán)境,這一點(diǎn)和 VMware 上面的快照功能很類似。
本程序的功能是根據(jù)循環(huán)次數(shù)隨機(jī)的生成 1~6 這 6 個(gè)數(shù)字,如果數(shù)字是 1,則金錢加一百,如果是二,則金錢減半,如果是 6,則隨機(jī)生成水果,水果分為好吃的和不好吃的,在保存的時(shí)候只保存好吃的水果,恢復(fù)的時(shí)候就只有好吃的水果了。當(dāng)金錢少于當(dāng)前備忘錄中金錢的一半的時(shí)候就要恢復(fù)到備忘錄的狀態(tài);當(dāng)金錢大于備忘錄的狀態(tài)的時(shí)候就要備份當(dāng)前的狀態(tài),備份的時(shí)候只備份好的水果以及當(dāng)前金額,這就是游戲的功能,可以看到運(yùn)行的結(jié)果的正確性。
這里有幾點(diǎn)要注意:
1、窄接口和寬接口。
在代碼中我已經(jīng)標(biāo)注出了窄接口和寬接口,如何定義這兩種接口還要看這兩種接口前面的修飾符,如果是默認(rèn)的(只有本包的類可以使用),并且這些接口結(jié)合到一起可以完全的將本類的信息顯示出來,那么就是寬接口;只能在本包之中使用,如果修飾符是 public 的接口,并且只能表示本類一部分信息,因?yàn)槭?public 可以在其他包中使用的,就是窄接口,只能查看部分信息,因此是窄的。如下圖所示,對(duì)于 Main 類所在的包,只能使用其他兩個(gè)類中聲明為 public 的字段和方法,因此在 Main 中只能使用窄接口來完成一定信息的讀取 getMenoy ()。這只是一個(gè)概念,強(qiáng)調(diào)的是類、字段、方法的可見性。
2、可見性。
同時(shí)我們也知道,public 修飾的字段和方法在任何包中都可以使用,private 修飾的字段和方法只能在本類之中使用,protected 修飾的方法可以在本包之中以及該類的子類(可以在其他包)中使用,默認(rèn)的沒有任何修飾的可以在本包之中使用。這就是四種修飾關(guān)鍵字的可見性。在編程的時(shí)候我們一定要考慮這些問題,不然就會(huì)導(dǎo)致我們不想看到的字段、方法、類被誤用的結(jié)果。
備忘錄模式也是一種非常常見的模式,用來保存對(duì)象的部分用于恢復(fù)的信息,和原型模式有著本質(zhì)的區(qū)別,廣泛運(yùn)用在快照功能中,另外我們知道了寬接口和窄接口,這里的接口指的就是方法,沒其他意思,以及類的可見性。同樣的使用備忘錄模式可以使得程序可以組件化,比如打算多次撤銷當(dāng)前的狀態(tài)以及不僅可以撤銷而且可以將當(dāng)前的狀態(tài)保存到文件中,我們不需要修改 Gamer 的代碼就能做到,職責(zé)明確是一種非常重要的軟件工程思想。

熱門跟貼