亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

實例講解JAVA設計模式之備忘錄模式

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

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

游戲的某個場景,一游戲角色有生命力、攻擊力、防御力等數據,在打Boss前和后會不一樣,我們允許玩家如果感覺與Boss決斗的效果不理想,可以讓游戲恢復到決斗前。下面是代碼:

游戲角色類,用來存儲角色的生命力、攻擊力、防御力的數據。

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

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

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

在不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態,這樣以后就可將該對象恢復到原先保存的狀態。

用備忘錄模式優化案例

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

輸出結果同上。

肯定有人會問:對于“角色狀態”的保存,直接調用RoleStateMemento進行set和get不就行了,為什么還需要一個RoleStateCaretaker類呢?

這是為了符合迪米特法則進行的優化!

備忘錄模式也是有缺點的,角色狀態需要完整存儲到備忘錄對象中,如果狀態數據很大很多,那么在資源消耗上,備忘錄對象會非常耗內存。所以也不是用的越多越好。

以上就是實例講解JAVA設計模式之備忘錄模式的詳細內容,更多關于JAVA 備忘錄模式的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 女人精aaaa片一级毛片女女 | 和日本免费不卡在线v | 国产精品免费看久久久 | 国产欧美日韩不卡一区二区三区 | 1769国内精品观看视频 | 97精品国产高清自在线看超 | 国产精品成人第一区 | 国产精品欧美日韩精品 | 特级aa一级欧美毛片 | 一级一级女人18毛片 | 国产成人18黄网站免费 | 国产成人av性色在线影院 | 欧美一区二区在线观看视频 | 国产精品高清久久久久久久 | 香蕉久久一区二区三区 | 看免费毛片 | 人体大胆做受免费视频 | 国产成人无精品久久久 | 黄色三级网站 | 日本黄视频在线观看 | 免费影院入口地址大全 | 日本国产在线观看 | 亚洲欧美日韩国产一区二区精品 | 69欧美xxxxx色护士视频 | 亚洲国产精品自在在线观看 | 国产精品久久久久免费视频 | 欧美专区视频 | 久久青草免费91线频观看不卡 | 国产又黄又爽又色视频影视网免费 | 看欧美黄色大片 | 麻豆国产一区二区在线观看 | 久久高清一区二区三区 | 亚洲一区免费 | 亚洲精品国产成人专区 | 尤物视频最新网址 | 欧美成人国产 | 国产日韩欧美一区二区 | 手机看片国产日韩 | 黄色a级在线观看 | 国产精品13页 | 国产欧美亚洲精品第3页在线 |