av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

實(shí)例講解JAVA設(shè)計(jì)模式之備忘錄模式

瀏覽:3日期:2022-08-30 13:24:53

在講述這個(gè)模式之前,我們先看一個(gè)案例:游戲回檔

游戲的某個(gè)場(chǎng)景,一游戲角色有生命力、攻擊力、防御力等數(shù)據(jù),在打Boss前和后會(huì)不一樣,我們?cè)试S玩家如果感覺(jué)與Boss決斗的效果不理想,可以讓游戲恢復(fù)到?jīng)Q斗前。下面是代碼:

游戲角色類,用來(lái)存儲(chǔ)角色的生命力、攻擊力、防御力的數(shù)據(jù)。

public class GameRole { private int vit;//生命力 private int atk;//攻擊力 private int def;//防御力 //狀態(tài)顯示 public void stateDisplay() { System.out.println('當(dāng)前角色狀態(tài):'); System.out.println('體力:'+this.vit); System.out.println('攻擊力'+this.atk); System.out.println('防御力'+this.def); } //獲取初始狀態(tài) public void getInitState() { //數(shù)據(jù)通常來(lái)自本地磁盤(pán)或遠(yuǎn)程數(shù)據(jù)庫(kù) this.vit = 100; this.atk = 100; this.def = 100; } //戰(zhàn)斗 public void fight() { //在與Boss大戰(zhàn)后游戲數(shù)據(jù)損耗為0 this.vit = 0; this.atk = 0; this.def = 0; } //省略getter、setter方法 }//測(cè)試方法public class Test { public static void main(String[] args) { //大戰(zhàn)Boss前 GameRole lixiaoyao = new GameRole(); lixiaoyao.getInitState();//Boss大戰(zhàn)前,獲得角色初始狀態(tài) lixiaoyao.stateDisplay(); //保存進(jìn)度,通過(guò)游戲角色的新實(shí)例來(lái)保存進(jìn)度 GameRole backup = new GameRole(); backup.setVit(lixiaoyao.getVit()); backup.setAtk(lixiaoyao.getAtk()); backup.setDef(lixiaoyao.getDef()); //大戰(zhàn)Boss時(shí),損耗嚴(yán)重,所有數(shù)據(jù)全部損耗為0 lixiaoyao.fight(); lixiaoyao.stateDisplay(); //恢復(fù)之前狀態(tài),重新來(lái)玩 lixiaoyao.setVit(backup.getVit()); lixiaoyao.setAtk(backup.getAtk()); lixiaoyao.setDef(backup.getDef()); lixiaoyao.stateDisplay(); }}

上面的代碼實(shí)現(xiàn)了效果,但是不理想的是:main方法里暴露了太多“細(xì)節(jié)”,使得main方法需要知道“生命力、攻擊力、防御力”這樣的細(xì)節(jié)。以后需要增加“魔法值”或修改現(xiàn)有的“生命力”為“經(jīng)驗(yàn)值”,這部分就要修改了。同樣的道理也存在于恢復(fù)時(shí)的代碼。顯然,我們希望的是把這些“游戲角色”的存取狀態(tài)細(xì)節(jié)封裝起來(lái),而且最好是封裝在外部的類中。以體現(xiàn)職責(zé)分離。

下面介紹備忘錄模式:https://www.jb51.net/article/189469.htm

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

用備忘錄模式優(yōu)化案例

public class GameRole { private int vit;//生命力 private int atk;//攻擊力 private int def;//防御力 //狀態(tài)顯示 public void stateDisplay() { System.out.println('當(dāng)前角色狀態(tài):'); System.out.println('體力:'+this.vit); System.out.println('攻擊力'+this.atk); System.out.println('防御力'+this.def); } //獲取初始狀態(tài) public void getInitState() { //數(shù)據(jù)通常來(lái)自本地磁盤(pán)或遠(yuǎn)程數(shù)據(jù)庫(kù) this.vit = 100; this.atk = 100; this.def = 100; } //戰(zhàn)斗 public void fight() { //在與Boss大戰(zhàn)后游戲數(shù)據(jù)損耗為0 this.vit = 0; this.atk = 0; this.def = 0; } //新增“保存角色狀態(tài)”方法,將游戲角色的三個(gè)狀態(tài)值通過(guò)實(shí)例化“角色狀態(tài)存儲(chǔ)箱”返回 public RoleStateMemento saveState() { return new RoleStateMemento(vit, atk, def); } //新增“恢復(fù)角色狀態(tài)”方法,可將外部的“角色狀態(tài)存儲(chǔ)箱”中的狀態(tài)值恢復(fù)給游戲角色 public void recoveryState(RoleStateMemento memento) { this.vit = memento.getAtk(); this.atk = memento.getAtk(); this.def = memento.getDef(); } //省略getter、setter方法 }//角色狀態(tài)存儲(chǔ)箱類public class RoleStateMemento { private int vit;//生命力 private int atk;//攻擊力 private int def;//防御力 //將生命力、攻擊力、防御力存入狀態(tài)存儲(chǔ)箱對(duì)象中 public RoleStateMemento(int vit, int atk, int def) { super(); this.vit = vit; this.atk = atk; this.def = def; } //省略getter、setter方法 }//角色狀態(tài)管理者類public class RoleStateCaretaker { private RoleStateMemento memento; public RoleStateMemento getMemento() { return memento; } public void setMemento(RoleStateMemento memento) { this.memento = memento; } }//測(cè)試方法public class Test { public static void main(String[] args) { //大戰(zhàn)Boss前 GameRole lixiaoyao = new GameRole(); lixiaoyao.getInitState();//Boss大戰(zhàn)前,獲得角色初始狀態(tài) lixiaoyao.stateDisplay(); //保存進(jìn)度,由于封裝在Memento中,因此我們并不知道保存了哪些具體的數(shù)據(jù) RoleStateCaretaker stateAdmin = new RoleStateCaretaker(); stateAdmin.setMemento(lixiaoyao.saveState()); //大戰(zhàn)Boss時(shí),損耗嚴(yán)重 lixiaoyao.fight(); lixiaoyao.stateDisplay(); //恢復(fù)之前的狀態(tài) lixiaoyao.recoveryState(stateAdmin.getMemento()); lixiaoyao.stateDisplay(); }}

輸出結(jié)果同上。

肯定有人會(huì)問(wèn):對(duì)于“角色狀態(tài)”的保存,直接調(diào)用RoleStateMemento進(jìn)行set和get不就行了,為什么還需要一個(gè)RoleStateCaretaker類呢?

這是為了符合迪米特法則進(jìn)行的優(yōu)化!

備忘錄模式也是有缺點(diǎn)的,角色狀態(tài)需要完整存儲(chǔ)到備忘錄對(duì)象中,如果狀態(tài)數(shù)據(jù)很大很多,那么在資源消耗上,備忘錄對(duì)象會(huì)非常耗內(nèi)存。所以也不是用的越多越好。

以上就是實(shí)例講解JAVA設(shè)計(jì)模式之備忘錄模式的詳細(xì)內(nèi)容,更多關(guān)于JAVA 備忘錄模式的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 毛片1| 亚洲看片 | 99精品国产一区二区三区 | 久久精品国产久精国产 | 婷婷丁香激情 | 中文字幕精品一区 | 9久久婷婷国产综合精品性色 | 亚洲日韩欧美一区二区在线 | 777zyz色资源站在线观看 | 国产精品a一区二区三区网址 | 日本精品一区二区 | 黄网在线观看 | 国产不卡在线观看 | 粉嫩高清一区二区三区 | 国产精品久久性 | 亚洲一区国产 | 国产精品一区二区在线播放 | 国产精品精品久久久 | 久久人爽 | 老子午夜影院 | 在线观看亚洲专区 | 91免费在线 | 日韩在线视频精品 | 亚洲成人在线视频播放 | 日韩免费在线观看视频 | 国产精品视频www | 国产精品亚洲第一 | 黄色片视频网站 | 欧美久久久久久久 | 午夜精品视频在线观看 | 欧美一区二区三区高清视频 | 羞羞视频在线观看 | 国产精品亚洲精品 | 精品熟人一区二区三区四区 | 久久高清 | 成人在线视频看看 | 国产国产精品久久久久 | 精品av天堂毛片久久久借种 | 一本色道精品久久一区二区三区 | 超碰av在线 | 91精品久久久久久久久久 |