电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:2日期: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
相關文章:
主站蜘蛛池模板: 气动调节阀,电动调节阀,自力式压力调节阀,切断阀「厂家」-浙江利沃夫自控阀门 | 杭州网络公司_百度SEO优化-外贸网络推广_抖音小程序开发-杭州乐软科技有限公司 | 广东教师资格网-广东教师资格证考试网 | 真空干燥烘箱_鼓风干燥箱 _高低温恒温恒湿试验箱_光照二氧化碳恒温培养箱-上海航佩仪器 | 北京模型公司-军事模型-工业模型制作-北京百艺模型沙盘公司 | 岩棉切条机厂家_玻璃棉裁条机_水泥基保温板设备-廊坊鹏恒机械 | 网站优化公司_北京网站优化_抖音短视频代运营_抖音关键词seo优化排名-通则达网络 | 桑茶-七彩贝壳桑叶茶 长寿茶| 大_小鼠elisa试剂盒-植物_人Elisa试剂盒-PCR荧光定量试剂盒-上海一研生物科技有限公司 | 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 油漆辅料厂家_阴阳脚线_艺术漆厂家_内外墙涂料施工_乳胶漆专用防霉腻子粉_轻质粉刷石膏-魔法涂涂 | 消泡剂_水处理消泡剂_切削液消泡剂_涂料消泡剂_有机硅消泡剂_广州中万新材料生产厂家 | 低压载波电能表-单相导轨式电能表-华邦电力科技股份有限公司-智能物联网综合管理平台 | 喷砂机厂家_自动除锈抛丸机价格-成都泰盛吉自动化喷砂设备 | 欧必特空气能-商用空气能热水工程,空气能热水器,超低温空气源热泵生产厂家-湖南欧必特空气能公司 | 深圳激光打标机_激光打标机_激光焊接机_激光切割机_同体激光打标机-深圳市创想激光科技有限公司 深圳快餐店设计-餐饮设计公司-餐饮空间品牌全案设计-深圳市勤蜂装饰工程 | 工装定制/做厂家/公司_工装订做/制价格/费用-北京圣达信工装 | 温湿度记录纸_圆盘_横河记录纸|霍尼韦尔记录仪-广州汤米斯机电设备有限公司 | 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 - 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 | 全自动烧卖机厂家_饺子机_烧麦机价格_小笼汤包机_宁波江北阜欣食品机械有限公司 | 旅游规划_旅游策划_乡村旅游规划_景区规划设计_旅游规划设计公司-北京绿道联合旅游规划设计有限公司 | R507制冷剂,R22/R152a制冷剂厂家-浙江瀚凯制冷科技有限公司 | 一体化污水处理设备-一体化净水设备-「山东梦之洁水处理」 | 旗帜网络笔记-免费领取《旗帜网络笔记》电子书 | 神超官网_焊接圆锯片_高速钢锯片_硬质合金锯片_浙江神超锯业制造有限公司 | 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 | 云南标线|昆明划线|道路标线|交通标线-就选云南云路施工公司-云南云路科技有限公司 | 智能监控-安防监控-监控系统安装-弱电工程公司_成都万全电子 | 沟盖板_复合沟盖板厂_电力盖板_树脂雨水篦子-淄博拜斯特 | 流程管理|流程管理软件|企业流程管理|微宏科技-AlphaFlow_流程管理系统软件服务商 | 泰来华顿液氮罐,美国MVE液氮罐,自增压液氮罐,定制液氮生物容器,进口杜瓦瓶-上海京灿精密机械有限公司 | 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库 | 泥浆在线密度计厂家-防爆数字压力表-膜盒-远传压力表厂家-江苏大亚自控设备有限公司 | 热回收盐水机组-反应釜冷水机组-高低温冷水机组-北京蓝海神骏科技有限公司 | CE认证_FCC认证_CCC认证_MFI认证_UN38.3认证-微测检测 CNAS实验室 | 首页-浙江橙树网络技术有限公司| 油罐车_加油机_加油卷盘_加油机卷盘_罐车人孔盖_各类球阀_海底阀等车用配件厂家-湖北华特专用设备有限公司 | 包头市鑫枫装饰有限公司| 小港信息港-鹤壁信息港 鹤壁老百姓便民生活信息网站 | 防勒索软件_数据防泄密_Trellix(原McAfee)核心代理商_Trellix(原Fireeye)售后-广州文智信息科技有限公司 | 钢格板|热镀锌钢格板|钢格栅板|钢格栅|格栅板-安平县昊泽丝网制品有限公司 |