最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年06月24日 15:18:06   作者:認(rèn)真對(duì)待  
這篇文章主要介紹了JAVA設(shè)計(jì)模式之備忘錄模式的的相關(guān)資料,文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下

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

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

游戲角色類,用來存儲(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ù)通常來自本地磁盤或遠(yuǎn)程數(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方法
 
}
//測(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)度,通過游戲角色的新實(shí)例來保存進(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),重新來玩
  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é)封裝起來,而且最好是封裝在外部的類中。以體現(xiàn)職責(zé)分離。

下面介紹備忘錄模式:http://m.fzitv.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ù)通常來自本地磁盤或遠(yuǎn)程數(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)”方法,將游戲角色的三個(gè)狀態(tài)值通過實(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ì)問:對(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)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java 8中default方法能做什么?不能做什么?

    Java 8中default方法能做什么?不能做什么?

    這篇文章主要給大家介紹了關(guān)于Java 8中default方法能做什么?不能做什么?文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • 淺談Java對(duì)象禁止使用基本類型

    淺談Java對(duì)象禁止使用基本類型

    本文主要介紹了淺談Java對(duì)象禁止使用基本類型,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 基于spring實(shí)現(xiàn)websocket實(shí)時(shí)推送實(shí)例

    基于spring實(shí)現(xiàn)websocket實(shí)時(shí)推送實(shí)例

    這篇文章主要為大家詳細(xì)介紹了基于spring實(shí)現(xiàn)websocket實(shí)時(shí)推送實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • 深入講解Java?synchronized的核心原理

    深入講解Java?synchronized的核心原理

    這篇文章主要為大家詳細(xì)介紹了Java中synchronized的核心原理以及簡(jiǎn)單的用法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-07-07
  • Java 實(shí)現(xiàn)實(shí)時(shí)監(jiān)聽文件夾是否有新文件增加并上傳服務(wù)器功能

    Java 實(shí)現(xiàn)實(shí)時(shí)監(jiān)聽文件夾是否有新文件增加并上傳服務(wù)器功能

    本文中主要陳述一種實(shí)時(shí)監(jiān)聽文件夾中是否有文件增加的功能,可用于實(shí)際文件上傳功能的開發(fā)。本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2019-09-09
  • Java多個(gè)線程同時(shí)執(zhí)行的方法

    Java多個(gè)線程同時(shí)執(zhí)行的方法

    這篇文章主要介紹了Java多線程處理文件詳解與代碼示例,通過本文的介紹和代碼示例,我們了解了如何使用Java多線程來處理文件,使用多線程技術(shù)可以顯著提高文件處理的效率,特別是對(duì)于大量文件的處理任務(wù),需要的朋友可以參考下
    2024-12-12
  • springboot項(xiàng)目之相互依賴報(bào)錯(cuò)問題(基于idea)

    springboot項(xiàng)目之相互依賴報(bào)錯(cuò)問題(基于idea)

    這篇文章主要介紹了springboot項(xiàng)目之相互依賴報(bào)錯(cuò)問題(基于idea),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 給新來的同事講where?1=1是什么意思

    給新來的同事講where?1=1是什么意思

    當(dāng)遇到多個(gè)查詢條件,使用where 1=1 可以很方便的解決我們的問題,但這究竟有什么意思呢?所以下面這篇文章主要給大家介紹了關(guān)于where?1=1是什么意思,需要的朋友可以參考下
    2021-12-12
  • SpringBoot如何使用Template請(qǐng)求http接口

    SpringBoot如何使用Template請(qǐng)求http接口

    在Spring?Boot中,如果你想要通過模板(template)的方式連接HTTP服務(wù),并發(fā)送HTTP請(qǐng)求,有幾種不同的方式可以實(shí)現(xiàn),但最直接和常用的方式之一是使用RestTemplate,這篇文章主要介紹了SpringBoot使用Template請(qǐng)求http接口,需要的朋友可以參考下
    2024-08-08
  • spring-boot-autoconfigure模塊用法詳解

    spring-boot-autoconfigure模塊用法詳解

    autoconfigure就是自動(dòng)配置的意思,spring-boot通過spring-boot-autoconfigure體現(xiàn)了"約定優(yōu)于配置"這一設(shè)計(jì)原則,而spring-boot-autoconfigure主要用到了spring.factories和幾個(gè)常用的注解條件來實(shí)現(xiàn)自動(dòng)配置,思路很清晰也很簡(jiǎn)單,感興趣的朋友跟隨小編一起看看吧
    2022-11-11

最新評(píng)論

吴旗县| 永济市| 万州区| 电白县| 阳原县| 高州市| 东光县| 汤阴县| 酉阳| 临沭县| 千阳县| 清水河县| 全州县| 绵阳市| 金昌市| 台中市| 佛学| 邵武市| 湖北省| 陆川县| 大新县| 比如县| 孟连| 两当县| 梓潼县| 大余县| 丹寨县| 纳雍县| 广州市| 勃利县| 花莲市| 台东市| 贡嘎县| 新邵县| 湘潭县| 太仆寺旗| 大港区| 中宁县| 道孚县| 灌云县| 疏附县|