日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

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

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

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

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

public class GameRole { private int vit;//生命力 private int atk;//攻擊力 private int def;//防御力 //狀態(tài)顯示 public void stateDisplay() { System.out.println('當前角色狀態(tài):'); System.out.println('體力:'+this.vit); System.out.println('攻擊力'+this.atk); System.out.println('防御力'+this.def); } //獲取初始狀態(tài) public void getInitState() { //數(shù)據(jù)通常來自本地磁盤或遠程數(shù)據(jù)庫 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方法 }//測試方法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(); //保存進度,通過游戲角色的新實例來保存進度 GameRole backup = new GameRole(); backup.setVit(lixiaoyao.getVit()); backup.setAtk(lixiaoyao.getAtk()); backup.setDef(lixiaoyao.getDef()); //大戰(zhàn)Boss時,損耗嚴重,所有數(shù)據(jù)全部損耗為0 lixiaoyao.fight(); lixiaoyao.stateDisplay(); //恢復之前狀態(tài),重新來玩 lixiaoyao.setVit(backup.getVit()); lixiaoyao.setAtk(backup.getAtk()); lixiaoyao.setDef(backup.getDef()); lixiaoyao.stateDisplay(); }}

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

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

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

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

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

輸出結(jié)果同上。

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

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

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

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

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩精品欧美大片| 日韩成人综合| 宅男噜噜噜66国产日韩在线观看| 神马日本精品| 日韩欧美精品综合| 久久精品99久久无色码中文字幕| 日本在线精品| 蜜臀av免费一区二区三区| 亚洲一级特黄| 丝瓜av网站精品一区二区| 亚洲精品亚洲人成在线观看| 日韩三级精品| 久久超碰99| 日韩伦理福利| 99精品小视频| 视频一区二区欧美| 97久久亚洲| 国产suv精品一区二区四区视频| 久久久久久婷| 美女网站一区| 五月激激激综合网色播| 国产精品一区高清| 在线观看精品| 久久亚洲影院| 国产精品一国产精品k频道56| 国产在视频一区二区三区吞精| 久久久久久久久丰满| 亚洲免费网址| 国产欧美日韩精品一区二区免费| 久久一区视频| 91精品一区国产高清在线gif| 欧美日韩国产一区二区三区不卡| 老牛国产精品一区的观看方式| 91久久精品无嫩草影院| 日韩a一区二区| 亚洲免费影院| 美女高潮久久久| 国产一区清纯| 欧美日本精品| 99精品视频在线观看免费播放| 蜜桃视频一区二区| 精品国产精品国产偷麻豆| 免费成人网www| 青青青国产精品| 92国产精品| 中文字幕亚洲影视| 国产美女高潮在线| 在线精品福利| 日韩一区电影| 日韩欧美在线精品| 日本美女一区| 日韩毛片网站| 欧美aa在线观看| 亚洲bt欧美bt精品777| 国产在线不卡一区二区三区| 在线综合亚洲| 国产成人精品一区二区免费看京 | 人人香蕉久久| 亚洲三级av| 日韩免费一区| 欧美日韩亚洲一区| 91久久国产| 麻豆91在线播放| 视频一区国产视频| 中文字幕高清在线播放| 日韩精品一页| 国内精品福利| 国产精品传媒麻豆hd| 黑丝一区二区三区| 色综合狠狠操| 国产免费久久| 亚洲一区二区三区高清| 激情视频网站在线播放色| 欧美一区成人| 丝袜脚交一区二区| 欧美日韩中文一区二区| 久久久久97| 午夜电影一区| 99国产精品私拍| 波多野结衣久久精品| 久久爱www成人| 婷婷精品在线观看| 91久久久久| 999久久久免费精品国产| 精品久久亚洲| 国产精品色在线网站| 免费视频一区二区| 1000部精品久久久久久久久| 免费在线亚洲欧美| 日韩av中文字幕一区二区三区| 国产婷婷精品| 成人羞羞视频在线看网址| 欧美成人一二区| 日韩精品五月天| 夜久久久久久| 久久精品官网| 日韩精品专区| 日韩成人精品一区| 免费日韩一区二区三区| 国产日韩欧美中文在线| 日韩国产欧美在线播放| 亚洲中午字幕| 国产农村妇女精品一区二区| 久久蜜桃av| 久久久777| 91精品蜜臀一区二区三区在线| 久久久久久久欧美精品| 亚洲激精日韩激精欧美精品| 久久久久中文| 国产高清不卡| 亚洲精品**中文毛片| 久久三级中文| 国产欧美日韩视频在线| 欧美一级网站| 青草国产精品久久久久久| 亚洲毛片在线免费| 涩涩涩久久久成人精品| 日韩精选在线| 国产三级一区| 国产精品一区二区美女视频免费看| 青青在线精品| 国产精品久久久一区二区| 国产精品草草| 精品视频一区二区三区在线观看 | 国产一区三区在线播放| 精品一区二区三区中文字幕在线| 国产精品午夜av| 久久av资源| 91欧美国产| 欧洲av不卡| 不卡视频在线| 日韩精品一区第一页| 最近国产精品视频| 欧美日韩99| 美女高潮久久久| 亚洲天堂av影院| 极品日韩av| 在线综合欧美| 日韩区欧美区| 国产精品**亚洲精品| 国产成人精品福利| 亚洲www啪成人一区二区| 不卡中文一二三区| 中文字幕一区二区三区在线视频| 欧美日韩一区二区三区不卡视频| 国产激情综合| 久久裸体视频| 在线精品一区二区| 国产精品一区二区三区av | 久久一区精品| av日韩中文| 亚洲精品123区| 日韩高清成人在线| 国产一区二区三区视频在线| 久久要要av| 亚洲伊人影院| 欧美极品一区二区三区| 少妇久久久久| 蜜桃av一区二区在线观看| 亚洲精品系列| 久久久久观看| 激情婷婷综合| 欧美日本三区| 色88888久久久久久影院| 蜜臀av亚洲一区中文字幕| 国产日韩亚洲| 久久91导航| 在线精品亚洲| 精品亚洲二区| 中文欧美日韩| 国产精品丝袜在线播放| 久久亚洲在线| 欧美一级二级视频| 亚洲成人一区在线观看| 香蕉久久久久久| 亚洲欧洲高清| 中文字幕一区二区三区日韩精品| 久久只有精品| 欧美中文日韩| 高潮久久久久久久久久久久久久| 午夜一级在线看亚洲| 国产精品一站二站| 图片区亚洲欧美小说区| 国产免费av国片精品草莓男男| 久久影院一区| 97久久亚洲| 欧美中文一区二区| 国产精品毛片aⅴ一区二区三区| 精品在线91| 精品一区二区三区四区五区| 亚洲欧美网站| 日韩在线观看| 欧美日韩亚洲一区三区| 国精品一区二区| 免费一区二区三区在线视频| 亚洲少妇一区| 精品中文在线| 日韩精品成人| 亚洲在线国产日韩欧美| 日韩欧美1区|