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

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

 更新時(shí)間:2023年12月29日 10:04:54   作者:理想萬歲萬萬歲  
這篇文章主要介紹了Java設(shè)計(jì)模式之備忘錄模式,備忘錄模式(Memento Pattern),屬于行為型設(shè)計(jì)模式,目的是用于保存一個(gè)對(duì)象在某一時(shí)刻的狀態(tài),以便于在將來某個(gè)時(shí)刻根據(jù)此狀態(tài)恢復(fù)該對(duì)象,需要的朋友可以參考下

一、介紹

備忘錄模式(Memento Pattern),屬于行為型設(shè)計(jì)模式。目的是用于保存一個(gè)對(duì)象在某一時(shí)刻的狀態(tài),以便于在將來某個(gè)時(shí)刻根據(jù)此狀態(tài)恢復(fù)該對(duì)象。

在我們?nèi)粘I钪?,備忘錄的使用十分頻繁。比如,有一個(gè)事情我們完成了35%的進(jìn)度,這時(shí)有另一件更重要的事情需要處理,那么我們需要對(duì)這個(gè)已完成35%的事情進(jìn)行記錄(做了哪些事情,做到什么程度等),當(dāng)那個(gè)更重要的事情完成后,就可以根據(jù)記錄的內(nèi)容(做了哪些事情,做到什么程度等)繼續(xù)處理這件事情,而不至于因?yàn)橥浱幚磉M(jìn)度而導(dǎo)致重復(fù)或疏漏,這個(gè)記錄的過程就是備忘。

另一個(gè)十分鮮活的例子就是,我們經(jīng)常在對(duì)一些東西進(jìn)行計(jì)數(shù)時(shí)被其他人說話而打斷,當(dāng)你回答對(duì)方后自己卻突然忘記數(shù)到哪里了,如果你在說話前已經(jīng)數(shù)了相當(dāng)長(zhǎng)一段時(shí)間,那此時(shí)你可能不得不從0重新開始計(jì)數(shù)。當(dāng)應(yīng)用備忘錄時(shí),無論你的計(jì)數(shù)達(dá)到什么程度,在別人和你說話時(shí),你先將當(dāng)前計(jì)數(shù)保存記錄下來,在談話完成后,再繼續(xù)計(jì)數(shù)即可,以此避免從0重新開始計(jì)數(shù)。

當(dāng)我們系統(tǒng)中存在一個(gè)對(duì)象,

下面是備忘錄模式的概念解釋:

在不破壞封裝性的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài)。

二、應(yīng)用舉例

根據(jù)我們?cè)诮榻B中的描述,我們應(yīng)該明白了備忘錄模式的本質(zhì)其實(shí)就是對(duì)象狀態(tài)的保存和讀取。不難發(fā)現(xiàn),備忘錄模式的應(yīng)用到處可見

幾乎所有的軟件

在我們使用的所有軟件無論是桌面端還是網(wǎng)頁端,只要有保存功能,就都是備忘錄模式的體現(xiàn)。

比如,我們使用txt文本文檔編輯文本,在編輯的過程中任意時(shí)刻我們都可以使用ctrl+s對(duì)其保存,當(dāng)再次打開該txt文檔時(shí),展示的就是我們最后一次保存時(shí)的文本,這種備忘的介質(zhì)就是硬盤。

再比如,我們?cè)谀骋粋€(gè)網(wǎng)站中對(duì)個(gè)人信息進(jìn)行編輯時(shí),當(dāng)按下保存按鈕時(shí),網(wǎng)頁會(huì)發(fā)起網(wǎng)絡(luò)請(qǐng)求,將我們編輯的個(gè)人信息發(fā)送到遠(yuǎn)程服務(wù)器,當(dāng)再次打開個(gè)人信息頁面進(jìn)行查看或編輯時(shí),網(wǎng)頁會(huì)再次向遠(yuǎn)程服務(wù)器發(fā)起請(qǐng)求獲取我們上一次保存?zhèn)€人信息。這種備忘的介質(zhì)就是遠(yuǎn)程數(shù)據(jù)庫。

java序列化

java的序列化和反序列化過程也是備忘錄模式的體現(xiàn)。其中,序列化的過程就相當(dāng)于對(duì)一個(gè)對(duì)象狀態(tài)的保存,反序列化的過程就相當(dāng)于對(duì)以保存的對(duì)象狀態(tài)進(jìn)行恢復(fù)。

三、基本角色

在標(biāo)準(zhǔn)的備忘錄模式中,包含以下三個(gè)角色:

Memento

保存對(duì)象的內(nèi)部狀態(tài)。即備忘錄本身。而既然是備忘錄,自然有兩個(gè)最基本的方法來保存和獲取其內(nèi)部保存的狀態(tài):getState()和setState()。

存儲(chǔ)源發(fā)器對(duì)象的狀態(tài)。備忘錄對(duì)象可以包括一個(gè)或多個(gè)狀態(tài)屬性,源發(fā)器可以根據(jù)需要保存和恢復(fù)狀態(tài)。

Originator

創(chuàng)建備忘錄,并保存指定對(duì)象的狀態(tài)。即備忘錄管理者。作為備忘錄的管理者,自然在其內(nèi)部保存著多個(gè)備忘(mementoList)和對(duì)應(yīng)的添加刪除方法(add(memento)和remove(memento))。

需要保存和恢復(fù)狀態(tài)的對(duì)象。它創(chuàng)建一個(gè)備忘錄對(duì)象,用于存儲(chǔ)當(dāng)前對(duì)象的狀態(tài),也可以使用備忘錄對(duì)象恢復(fù)自身的狀態(tài)。

Caretaker

從備忘錄中讀取對(duì)象的狀態(tài)并恢復(fù)對(duì)象。有了備忘錄管理者,我們對(duì)備忘錄的操作應(yīng)轉(zhuǎn)移到管理者上,通過備忘錄管理者存取備忘錄中的狀態(tài)。

負(fù)責(zé)保存?zhèn)渫泴?duì)象,但不能修改備忘錄對(duì)象的內(nèi)容。它可以存儲(chǔ)多個(gè)備忘錄對(duì)象,并決定何時(shí)將備忘錄恢復(fù)給源發(fā)器。

注意:一般情況下,備忘錄模式無需抽象組件,但究竟需不需要抽象類根據(jù)實(shí)際情況來定。

備忘錄的通用UML圖如下所示

在這里插入圖片描述

四、代碼演示

下面我們通過代碼對(duì)上面基本角色的分析進(jìn)行演示

備忘錄類Memento

public class Memento {
    // 對(duì)象某一時(shí)刻的狀態(tài)
    private String state;
    // 獲取對(duì)象的狀態(tài)
    public String getState() {
        return state;
    }
    // 保存對(duì)象的狀態(tài)
    public void setState(String state) {
        this.state = state;
    }
}

備忘錄管理員類Originator

public class Originator {
    // 備忘錄集合
    private final List<Memento> mementoList;
    public Originator() {
        // 對(duì)備忘錄集合進(jìn)行初始化
        this.mementoList = new ArrayList<>();
    }
    // 保存對(duì)象某一狀態(tài)到備忘錄
    public void saveState(String state) {
        Memento memento = new Memento();
        memento.setState(state);
        mementoList.add(memento);
    }
    // 獲取某一備忘錄并將其移除
    public Memento getMemento(int index) {
        return mementoList.remove(index);
    }
}

讀取狀態(tài)類Caretaker

public class Caretaker {
    // 備忘錄管理者
    private final Originator originator;
    // 備忘錄管理者的初始化
    public Caretaker(Originator originator) {
        this.originator = originator;
    }
    // 獲取某個(gè)備忘錄中對(duì)象的狀態(tài)
    public String getState(Integer index) {
        return originator.getMemento(index).getState();
    }
}

客戶端測(cè)試代碼

public class MementoDemo {
    public static void main(String[] args) {
        // 將對(duì)象的狀態(tài)交給備忘錄管理員通過備忘錄管理
        Originator originator = new Originator();
        originator.saveState("第一個(gè)字符串");
        originator.saveState("第二個(gè)字符串");
        originator.saveState("第三個(gè)字符串");
        originator.saveState("第四個(gè)字符串");
        originator.saveState("第五個(gè)字符串");
        // 讀取備忘錄中對(duì)象的狀態(tài)
        Caretaker caretaker = new Caretaker(originator);
        String state5 = caretaker.getState(4);
        System.out.println(state5);
        String state4 = caretaker.getState(3);
        System.out.println(state4);
        String state3 = caretaker.getState(2);
        System.out.println(state3);
        String state2 = caretaker.getState(1);
        System.out.println(state2);
        String state1 = caretaker.getState(0);
        System.out.println(state1);
    }
}

運(yùn)行以上代碼,得到以下輸出

在這里插入圖片描述

五、總結(jié)

備忘錄模式給我們提供了一種可以恢復(fù)狀態(tài)的機(jī)制,可以使用戶能夠比較方便地回到某個(gè)歷史的狀態(tài),在此同時(shí),備忘錄模式也實(shí)現(xiàn)了信息的封裝,使得用戶不需要關(guān)心狀態(tài)的保存細(xì)節(jié)。

但是,備忘錄模式的可擴(kuò)展性并不是很好,每一種對(duì)象都需要對(duì)應(yīng)一種備忘錄,這將會(huì)導(dǎo)致類的數(shù)量膨脹,對(duì)內(nèi)存無疑是一種考驗(yàn)。

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

相關(guān)文章

  • 深入理解spring如何管理事務(wù)

    深入理解spring如何管理事務(wù)

    文章詳細(xì)介紹了Spring框架中的事務(wù)管理機(jī)制,包括事務(wù)的基本概念、事務(wù)管理的兩種方式、Spring事務(wù)管理的整體架構(gòu)、事務(wù)配置、聲明式事務(wù)的實(shí)現(xiàn)原理、事務(wù)的關(guān)鍵流程、事務(wù)屬性與配置,以及實(shí)際開發(fā)中常見的事務(wù)問題和解決方案,感興趣的朋友一起看看吧
    2025-01-01
  • mybatis打印SQL,并顯示參數(shù)的實(shí)例

    mybatis打印SQL,并顯示參數(shù)的實(shí)例

    這篇文章主要介紹了mybatis打印SQL,并顯示參數(shù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • java實(shí)現(xiàn)俄羅斯方塊游戲

    java實(shí)現(xiàn)俄羅斯方塊游戲

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)俄羅斯方塊游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • Java中的字符串用法小結(jié)

    Java中的字符串用法小結(jié)

    這篇文章主要介紹了Java中的字符串用法,實(shí)例總結(jié)了java中關(guān)于字符串操作的各種常用的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • java學(xué)習(xí)之猜數(shù)字小游戲

    java學(xué)習(xí)之猜數(shù)字小游戲

    這篇文章主要為大家詳細(xì)介紹了java學(xué)習(xí)之猜數(shù)字小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Java中的接口及其應(yīng)用場(chǎng)景解讀

    Java中的接口及其應(yīng)用場(chǎng)景解讀

    這篇文章主要介紹了Java中的接口及其應(yīng)用場(chǎng)景解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Maven版本管理之SNAPSHOT,Release與Nexus倉庫的區(qū)別和影響詳解

    Maven版本管理之SNAPSHOT,Release與Nexus倉庫的區(qū)別和影響詳解

    在?Java?Maven?項(xiàng)目中,我們經(jīng)常會(huì)看到不同形式的版本號(hào),這些版本號(hào)看起來差別不大,但在?Maven?構(gòu)建、依賴管理和生產(chǎn)環(huán)境穩(wěn)定性方面,影響非常明顯,下面小編就和大家詳細(xì)講解一下吧
    2026-05-05
  • java抓取12306信息實(shí)現(xiàn)火車余票查詢示例

    java抓取12306信息實(shí)現(xiàn)火車余票查詢示例

    這篇文章主要介紹了java抓取12306信息實(shí)現(xiàn)火車余票查詢示例,需要的朋友可以參考下
    2014-04-04
  • Spring注解@RestControllerAdvice原理解析

    Spring注解@RestControllerAdvice原理解析

    這篇文章主要介紹了Spring注解@RestControllerAdvice原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Java實(shí)現(xiàn)一次性下載多個(gè)文件

    Java實(shí)現(xiàn)一次性下載多個(gè)文件

    文章介紹了如何將全部數(shù)據(jù)按每500條生成一個(gè)Excel文件,并將這些文件壓縮導(dǎo)出,還提到中文文件名在服務(wù)器上出現(xiàn)亂碼,可能是編碼不一致導(dǎo)致的
    2025-10-10

最新評(píng)論

通渭县| 吉木乃县| 延安市| 桦甸市| 任丘市| 柘城县| 乌拉特中旗| 陈巴尔虎旗| 金湖县| 廉江市| 岐山县| 深水埗区| 通化县| 阿巴嘎旗| 象山县| 云安县| 无锡市| 西青区| 盖州市| 平谷区| 安平县| 堆龙德庆县| 南华县| 木兰县| 永兴县| 香港| 宣化县| 伽师县| 阿瓦提县| 隆子县| 喜德县| 清河县| 开平市| 安庆市| 阜新| 宣武区| 叶城县| 伊川县| 厦门市| 综艺| 彰化县|