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

Java設(shè)計(jì)模式之備忘錄模式詳解

 更新時(shí)間:2023年12月18日 09:51:11   作者:暴躁的程序猿啊  
這篇文章主要介紹了Java設(shè)計(jì)模式之備忘錄模式詳解,備忘錄模式在不破壞封裝性的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài)并在該對(duì)象之外保存這個(gè)狀態(tài),這樣以后就可以將該對(duì)象恢復(fù)到原先保存的狀態(tài),需要的朋友可以參考下

Java備忘錄模式

游戲角色狀態(tài)恢復(fù)問(wèn)題

游戲角色有攻擊力和防御力,在大戰(zhàn)boss之前保存自身的狀態(tài)(攻擊力血量等等),當(dāng)大戰(zhàn)boss后攻擊力和防御力下降,從備忘錄對(duì)象恢復(fù)到大戰(zhàn)前的狀態(tài)

傳統(tǒng)的方式問(wèn)題分析

1.一個(gè)對(duì)象,就對(duì)應(yīng)一個(gè)保存對(duì)象狀態(tài)的對(duì)象,這樣當(dāng)我們游戲的對(duì)象很多時(shí),不利于管理,開銷也很大

2.傳統(tǒng)的方式是簡(jiǎn)單的備份,new出另外一個(gè)對(duì)象出來(lái),再把需要備份的數(shù)據(jù)放到這個(gè)新對(duì)象,但這樣就暴露了對(duì)象的內(nèi)部細(xì)節(jié)

解決方案 : 備忘錄模式

模式基本介紹:

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

2.可以這里理解備忘錄模式顯示生活中的備忘錄模式是用來(lái)記錄某些要去做的事情或者是記錄已經(jīng)打成的共同意見的事情,以防忘記了。而在軟件層面,備忘錄模式有著相同的含義,備忘錄對(duì)象主要用來(lái)獲取一個(gè)對(duì)象的某種狀態(tài),或者某些數(shù)據(jù),當(dāng)要做回退時(shí),可以從備忘錄對(duì)象里獲取原來(lái)的數(shù)據(jù)進(jìn)行恢復(fù)操作

3.備忘錄模式屬于行為型模式

備忘錄模式類圖對(duì)象說(shuō)明

1.originator:對(duì)象(需要保存狀態(tài)的對(duì)象)

2.Memento:備忘錄對(duì)象,負(fù)責(zé)保存好記錄即Originator的內(nèi)部狀態(tài)

3.Caretaker:守護(hù)者對(duì)象,負(fù)責(zé)保存多個(gè)備忘錄對(duì)象,使用集合管理,提高效率

4.如果希望保存多個(gè)Originator對(duì)象的不同時(shí)間的狀態(tài)也可以,只需要HashMap<String,集合>

游戲角色恢復(fù)狀態(tài)實(shí)例

備忘錄對(duì)象

/**
 * @create: 2021/10/16
 * @author: Tony Stark
 */
public class Memento {
    private  String  state;
    public Memento(String state) {
        this.state=state;
    }
    public String getState() {
        return state;
    }
}

源對(duì)象

/**
 * @create: 2021/10/16
 * @author: Tony Stark
 */
public class Originator {
    private String state;
    public Memento saveState(){
        return new Memento(state);
    }
    public void getStateMemento(Memento memento){
         state=memento.getState();
    }
    public String getState() {
        return state;
    }
    public void setState(String state) {
        this.state = state;
    }
}

管理備忘錄對(duì)象的類

符合迪米特法則

/**
 * @create: 2021/10/16
 * @author: Tony Stark
 */
public class Caretaker {
    private List<Memento> mementoList=new ArrayList<>();
    public  void add(Memento memento){
         mementoList.add(memento);
    }
    public  Memento getIndex(int index){
     return  mementoList.get(index);
    }
}

調(diào)用測(cè)試

/**
 * @create: 2021/10/16
 * @author: Tony Stark
 */
public class Client {
    public static void main(String[] args) {
        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker();
        originator.setState("血量100%");
        System.out.println(originator.getState());
        System.out.println("保存當(dāng)前血量");
        caretaker.add(originator.saveState());
        System.out.println("團(tuán)戰(zhàn)中------->團(tuán)戰(zhàn)結(jié)束");
        originator.setState("血量50%");
        System.out.println("剩余血量為------->"+originator.getState());
        originator.getStateMemento(caretaker.getIndex(0));
        System.out.println("回基地補(bǔ)充血量---->血量恢復(fù)為---"+originator.getState());
    }
}

輸出

血量100%
保存當(dāng)前血量
團(tuán)戰(zhàn)中------->團(tuán)戰(zhàn)結(jié)束
剩余血量為------->血量50%
回基地補(bǔ)充血量---->血量恢復(fù)為---血量100%

備忘錄模式的注意事項(xiàng)和細(xì)節(jié)

1.給用戶提供了一種可以恢復(fù)狀態(tài)的機(jī)制,可以使用戶能夠比較方便的回到某個(gè)歷史的狀態(tài)

2.實(shí)現(xiàn)了信息的封裝,使用戶不需要關(guān)心狀態(tài)的保存細(xì)節(jié)

3.如果類的成員變量過(guò)多,勢(shì)必會(huì)占用比較大的資源,而且每一次保存都會(huì)消耗一定的內(nèi)存,這個(gè)需要注意

4.適用的應(yīng)用場(chǎng)景1.后悔藥 2.游戲的存檔3.Windows里的Ctri+z撤銷 4.IE中的后退5.數(shù)據(jù)庫(kù)的事務(wù)管理

5.為了節(jié)約內(nèi)存,備忘錄模式可以和原型模式配合使用

到此這篇關(guān)于Java設(shè)計(jì)模式之備忘錄模式詳解的文章就介紹到這了,更多相關(guān)Java備忘錄模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Boot ActiveMQ如何設(shè)置訪問(wèn)密碼

    Spring Boot ActiveMQ如何設(shè)置訪問(wèn)密碼

    這篇文章主要介紹了Spring Boot ActiveMQ如何設(shè)置訪問(wèn)密碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Java無(wú)限級(jí)樹(遞歸)超實(shí)用案例

    Java無(wú)限級(jí)樹(遞歸)超實(shí)用案例

    下面小編就為大家?guī)?lái)一篇Java無(wú)限級(jí)樹(遞歸)超實(shí)用案例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-11-11
  • 解決springboot中mongodb不啟動(dòng)及Dao不能被掃描到的問(wèn)題

    解決springboot中mongodb不啟動(dòng)及Dao不能被掃描到的問(wèn)題

    這篇文章主要介紹了解決springboot中mongodb不啟動(dòng)及Dao不能被掃描到的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • java中List集合去重常見的幾種方法總結(jié)

    java中List集合去重常見的幾種方法總結(jié)

    在Java編程中List集合是一種常用的數(shù)據(jù)結(jié)構(gòu),它允許我們存儲(chǔ)和操作一組有序的對(duì)象,這篇文章主要給大家介紹了關(guān)于java中List集合去重常見的幾種方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-07-07
  • 利用maven引入第三方j(luò)ar包以及打包

    利用maven引入第三方j(luò)ar包以及打包

    Maven是通過(guò)倉(cāng)庫(kù)對(duì)依賴進(jìn)行管理的,當(dāng)Maven項(xiàng)目需要某個(gè)依賴時(shí),只要其POM中聲明了依賴的坐標(biāo)信息,Maven就會(huì)自動(dòng)從倉(cāng)庫(kù)中去下載該構(gòu)件使用,如何將jar引用到項(xiàng)目,并且能夠讓項(xiàng)目正常調(diào)用該jar包的方法,本篇文章重點(diǎn)針對(duì)于這兩點(diǎn)進(jìn)行講解
    2023-05-05
  • SpringBoot 下的 Static 文件夾打包成前端資源的示例代碼

    SpringBoot 下的 Static 文件夾打包成前端資源的示例代碼

    這篇文章主要介紹了SpringBoot 下的 Static 文件夾如何打包成前端資源,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • SpringBoot中的HATEOAS詳情

    SpringBoot中的HATEOAS詳情

    這篇文章主要介紹了SpringBoot中的HATEOAS詳情,SpringBoot提供了HATEOAS的便捷使用方式,文章圍繞主題展開詳細(xì)介紹內(nèi)容,需要的小伙伴可以參考一下
    2022-05-05
  • java自定義驗(yàn)證器的實(shí)現(xiàn)示例

    java自定義驗(yàn)證器的實(shí)現(xiàn)示例

    在對(duì)外暴露接口中,我們通常會(huì)對(duì)入?yún)⑦M(jìn)行驗(yàn)證,比如一些字符串非空判斷等,本文主要介紹了java自定義驗(yàn)證器的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • Java?EasyExcel創(chuàng)建復(fù)雜表格的完整指南

    Java?EasyExcel創(chuàng)建復(fù)雜表格的完整指南

    WriteTable?是?EasyExcel?庫(kù)中的一個(gè)核心組件,用于在同一個(gè)?Excel?表單(Sheet)內(nèi)創(chuàng)建多個(gè)獨(dú)立的表格區(qū)域,下面我們來(lái)看看如何使用WriteTable創(chuàng)建復(fù)雜表格吧
    2025-12-12
  • Java面試題篇之Sleep()方法與Wait()方法的區(qū)別詳解

    Java面試題篇之Sleep()方法與Wait()方法的區(qū)別詳解

    這篇文章主要給大家介紹了關(guān)于Java面試題篇之Sleep()方法與Wait()方法區(qū)別的相關(guān)資料,wait()是Object類中的方法,而sleep()是Thread類中的靜態(tài)方法,wait()方法用于多個(gè)線程之間的協(xié)作和通信,而sleep()方法用于線程的休眠,需要的朋友可以參考下
    2024-07-07

最新評(píng)論

鄂托克前旗| 桦川县| 衡山县| 永德县| 阳城县| 沽源县| 安宁市| 九寨沟县| 肥乡县| 泾川县| 榕江县| 云安县| 尼玛县| 河北省| 连江县| 宣化县| 田林县| 菏泽市| 开化县| 吉安县| 澄城县| 琼海市| 西吉县| 中方县| 沾益县| 什邡市| 墨脱县| 扬中市| 阿拉善盟| 雷山县| 五指山市| 哈密市| 额敏县| 寻乌县| 孟州市| 抚顺市| 达日县| 互助| 盐源县| 云南省| 鄂托克旗|