中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java備忘錄模式怎么實現

發布時間:2022-10-17 16:00:32 來源:億速云 閱讀:123 作者:iii 欄目:編程語言

本篇內容主要講解“java備忘錄模式怎么實現”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“java備忘錄模式怎么實現”吧!

備忘錄模式

備忘錄模式又稱為快照模式或令牌模式,屬于行為型模式。

它是指在不破壞封裝的前提下,捕獲一個對象的內部狀態,并在對象之外保存這個狀態。這樣以后就可將該對象恢復到原先保存的狀態。簡而言之:允許在不暴露對象實現細節的情況下保存和恢復對象之前的狀態。

它提供一種類似“后悔藥”的機制,通過存儲系統各個歷史狀態的快照,使得可以在任一時刻將系統回滾到某一個歷史狀態。

應用場景

1.需要保存歷史快照的場景

2.希望在對象之外保存狀態,且除了自己其他類對象無法訪問狀態保存具體內容

應用場景舉例:代碼版本控制,游戲存檔功能,數據庫的事務管理等

假如有一款編輯器應用程序,程序在執行任何操作前記錄所有的對象狀態, 并將其保存下來。 當用戶此后需要撤銷某個操作時, 程序將從歷史記錄中獲取最近的快照, 然后使用它來恢復所有對象的狀態。

優缺點

優點:

1.簡化發起人實體類Originator職責,隔離狀態存儲與獲取,實現了信息的封裝,客戶端無需關心狀態的保存細節

2.提供狀態回滾功能:給用戶提供了一種可以恢復狀態的機制,可以使用戶能夠比較方便地回到某個歷史的狀態。

缺點:

1.消耗資源:如果需要保存的狀態過多時,每一次保存都會消耗很多內存。

主要角色

備忘錄模式主要包含三種角色:

1.發起人角色(Originator)

負責創建一個備忘錄,記錄自身需要保存的狀態;具備狀態回滾功能。

2.備忘錄角色(Memento)

用于存儲Originator的內部狀態,且可以防止Originator以外的對象進行訪問。

3.備忘錄管理員角色(Caretaker)

負責存儲,提供管理備忘錄(Memento),無法對備忘錄內容進行操作和訪問。

備忘錄模式本質是從發起人實體類(Originator)隔離存儲功能,降低實體類的職責。同時由于存儲信息(Memento)獨立,且存儲信息的實體交由管理類(Caretaker)管理,則可以通過為管理類擴展額外的功能對存儲信息進行擴展操作。

備忘錄模式的基本使用

創建發備忘錄角色

@Data
public class Memento {
    private String state;

    public Memento(String state){
        this.state = state;
    }
}

創建發起人角色

@Data
public class Originator {
    /**
     * 內部狀態
     */
    private String state;

    /**
     * 創建一個備忘錄
     *
     * @return
     */
    public Memento createMemento() {
        return new Memento(this.state);
    }

    /**
     * 從備忘錄恢復
     *
     * @param memento
     */
    public void restoreMemento(Memento memento) {
        this.setState(memento.getState());
    }
}

創建備忘錄管理員角色

public class Caretaker {
    private Memento memento;

    public Memento getMemento() {
        return this.memento;
    }
    public void storeMemento(Memento memento) {
        this.memento = memento;
    }
}

客戶端執行

    public static void main(String[] args) {
        // 創建發起人角色
        Originator originator = new Originator();
        // 創建備忘錄管理員
        Caretaker caretaker = new Caretaker();
        // 設置存儲狀態
        originator.setState("A");
        // 存儲發起人創建的備忘錄
        caretaker.storeMemento(originator.createMemento());
        System.out.println("設置存儲狀態:" + originator.getState());

        // 設置存儲狀態
        originator.setState("B");
        System.out.println("更新存儲狀態:" + originator.getState());

        // 備忘錄進行回滾
        originator.restoreMemento(caretaker.getMemento());
        System.out.println("回滾到設置的狀態:" + originator.getState());
    }
設置存儲狀態:A
更新存儲狀態:B
回滾到設置的狀態:A

使用備忘錄模式實現代碼版本控制

創建發備忘錄角色

@Data
@ToString
public class CodeMemento {
    /**
     * 提交內容
     */
    private String content;
    /**
     * 提交備注
     */
    private String remark;

    public CodeMemento(String content, String remark) {
        this.content = content;
        this.remark = remark;
    }
}

創建發起人角色

@Data
@ToString
public class GitOriginator {
    /**
     * 提交內容
     */
    private String content;
    /**
     * 提交備注
     */
    private String remark;

    public GitOriginator(String content, String remark) {
        this.content = content;
        this.remark = remark;
    }

    /**
     * 提交代碼
     *
     * @return
     */
    public CodeMemento saveToMemento() {
        CodeMemento codeMemento = new CodeMemento(this.content, this.remark);
        return codeMemento;
    }

    /**
     * 恢復代碼
     *
     * @param codeMemento
     */
    public void undoFromMemento(CodeMemento codeMemento) {
        this.content = codeMemento.getContent();
        this.remark = codeMemento.getRemark();
    }
}

創建備忘錄管理員角色

public class GitCaretaker {
    /**
     * 使用棧來存儲備忘錄,最新的備忘錄排在棧頂
     */
    private final Stack<CodeMemento> STACK = new Stack<CodeMemento>();

    public CodeMemento getMemento(){
        // 移除棧頂的備忘錄
        CodeMemento codeMemento = STACK.pop();
        return codeMemento;
    }

    public void addMemento(CodeMemento codeMemento){
        // 將備忘錄壓入棧頂
        STACK.push(codeMemento);
    }

}

客戶端執行

    public static void main(String[] args) {
        System.out.println("--------------------第一次創建代碼--------------------------------");
        // 創建一個備忘錄管理者
        GitCaretaker gitCaretaker = new GitCaretaker();
        // 創建一個備忘錄發起人
        GitOriginator gitOriginator = new GitOriginator("write code 1", "第一次提交代碼備注");
        // 創建一個備忘錄
        CodeMemento codeMemento = gitOriginator.saveToMemento();
        // 將備忘錄壓入棧頂
        gitCaretaker.addMemento(codeMemento);
        System.out.println("第一次提交代碼完成。代碼:" + gitOriginator.getContent() + " 備注:" + gitOriginator.getRemark());


        System.out.println("--------------------第二次修改代碼--------------------------------");
        gitOriginator.setContent("write code 2");
        gitOriginator.setRemark("第二次提交代碼備注");
        codeMemento = gitOriginator.saveToMemento();
        gitCaretaker.addMemento(codeMemento);
        System.out.println("第二次提交代碼完成。代碼:" + gitOriginator.getContent() + " 備注:" + gitOriginator.getRemark());


        System.out.println("--------------------第三次修改代碼--------------------------------");
        gitOriginator.setContent("write code 3");
        System.out.println("第三次修改代碼。代碼:" + gitOriginator.getContent());


        System.out.println("--------------------在第三次修改代碼基礎上回退到第二次提交--------------------------------");
        codeMemento = gitCaretaker.getMemento();
        gitOriginator.undoFromMemento(codeMemento);
        System.out.println("回退到第二次提交完成。代碼:" + gitOriginator.getContent() + " 備注:" + gitOriginator.getRemark());


        System.out.println("--------------------在第二次修改代碼基礎上回退到第一次提交--------------------------------");
        codeMemento = gitCaretaker.getMemento();
        gitOriginator.undoFromMemento(codeMemento);
        System.out.println("回退到第一次提交完成。代碼:" + gitOriginator.getContent() + " 備注:" + gitOriginator.getRemark());
    }
--------------------第一次創建代碼--------------------------------
第一次提交代碼完成。代碼:write code 1 備注:第一次提交代碼備注
--------------------第二次修改代碼--------------------------------
第二次提交代碼完成。代碼:write code 2 備注:第二次提交代碼備注
--------------------第三次修改代碼--------------------------------
第三次修改代碼。代碼:write code 3
--------------------在第三次修改代碼基礎上回退到第二次提交--------------------------------
回退到第二次提交完成。代碼:write code 2 備注:第二次提交代碼備注
--------------------在第二次修改代碼基礎上回退到第一次提交--------------------------------
回退到第一次提交完成。代碼:write code 1 備注:第一次提交代碼備注

到此,相信大家對“java備忘錄模式怎么實現”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沁阳市| 祁门县| 宜章县| 噶尔县| 兰西县| 阿尔山市| 高要市| 古田县| 九江县| 嘉义县| 新兴县| 阿尔山市| 太仆寺旗| 福海县| 金山区| 纳雍县| 凌源市| 六枝特区| 张家口市| 玉门市| 牙克石市| 高州市| 东乡族自治县| 宝应县| 连平县| 达孜县| 澄城县| 富蕴县| 三台县| 从化市| 安阳县| 南丰县| 赤城县| 吉木乃县| 湟中县| 郴州市| 黄冈市| 巴林左旗| 琼中| 龙山县| 明星|