欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

java備忘錄模式怎么實(shí)現(xiàn)

本篇內(nèi)容主要講解“java備忘錄模式怎么實(shí)現(xiàn)”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“java備忘錄模式怎么實(shí)現(xiàn)”吧!

創(chuàng)新互聯(lián)建站成都企業(yè)網(wǎng)站建設(shè)服務(wù),提供網(wǎng)站制作、成都做網(wǎng)站網(wǎng)站開(kāi)發(fā),網(wǎng)站定制,建網(wǎng)站,網(wǎng)站搭建,網(wǎng)站設(shè)計(jì),成都響應(yīng)式網(wǎng)站建設(shè)公司,網(wǎng)頁(yè)設(shè)計(jì)師打造企業(yè)風(fēng)格網(wǎng)站,提供周到的售前咨詢和貼心的售后服務(wù)。歡迎咨詢做網(wǎng)站需要多少錢(qián):028-86922220

備忘錄模式

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

它是指在不破壞封裝的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在對(duì)象之外保存這個(gè)狀態(tài)。這樣以后就可將該對(duì)象恢復(fù)到原先保存的狀態(tài)。簡(jiǎn)而言之:允許在不暴露對(duì)象實(shí)現(xiàn)細(xì)節(jié)的情況下保存和恢復(fù)對(duì)象之前的狀態(tài)。

它提供一種類似“后悔藥”的機(jī)制,通過(guò)存儲(chǔ)系統(tǒng)各個(gè)歷史狀態(tài)的快照,使得可以在任一時(shí)刻將系統(tǒng)回滾到某一個(gè)歷史狀態(tài)。

應(yīng)用場(chǎng)景

1.需要保存歷史快照的場(chǎng)景

2.希望在對(duì)象之外保存狀態(tài),且除了自己其他類對(duì)象無(wú)法訪問(wèn)狀態(tài)保存具體內(nèi)容

應(yīng)用場(chǎng)景舉例:代碼版本控制,游戲存檔功能,數(shù)據(jù)庫(kù)的事務(wù)管理等

假如有一款編輯器應(yīng)用程序,程序在執(zhí)行任何操作前記錄所有的對(duì)象狀態(tài), 并將其保存下來(lái)。 當(dāng)用戶此后需要撤銷某個(gè)操作時(shí), 程序?qū)臍v史記錄中獲取最近的快照, 然后使用它來(lái)恢復(fù)所有對(duì)象的狀態(tài)。

優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

1.簡(jiǎn)化發(fā)起人實(shí)體類Originator職責(zé),隔離狀態(tài)存儲(chǔ)與獲取,實(shí)現(xiàn)了信息的封裝,客戶端無(wú)需關(guān)心狀態(tài)的保存細(xì)節(jié)

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

缺點(diǎn):

1.消耗資源:如果需要保存的狀態(tài)過(guò)多時(shí),每一次保存都會(huì)消耗很多內(nèi)存。

主要角色

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

1.發(fā)起人角色(Originator)

負(fù)責(zé)創(chuàng)建一個(gè)備忘錄,記錄自身需要保存的狀態(tài);具備狀態(tài)回滾功能。

2.備忘錄角色(Memento)

用于存儲(chǔ)Originator的內(nèi)部狀態(tài),且可以防止Originator以外的對(duì)象進(jìn)行訪問(wèn)。

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

負(fù)責(zé)存儲(chǔ),提供管理備忘錄(Memento),無(wú)法對(duì)備忘錄內(nèi)容進(jìn)行操作和訪問(wèn)。

備忘錄模式本質(zhì)是從發(fā)起人實(shí)體類(Originator)隔離存儲(chǔ)功能,降低實(shí)體類的職責(zé)。同時(shí)由于存儲(chǔ)信息(Memento)獨(dú)立,且存儲(chǔ)信息的實(shí)體交由管理類(Caretaker)管理,則可以通過(guò)為管理類擴(kuò)展額外的功能對(duì)存儲(chǔ)信息進(jìn)行擴(kuò)展操作。

備忘錄模式的基本使用

創(chuàng)建發(fā)備忘錄角色

@Data
public class Memento {
    private String state;

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

創(chuàng)建發(fā)起人角色

@Data
public class Originator {
    /**
     * 內(nèi)部狀態(tài)
     */
    private String state;

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

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

創(chuàng)建備忘錄管理員角色

public class Caretaker {
    private Memento memento;

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

客戶端執(zhí)行

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

        // 設(shè)置存儲(chǔ)狀態(tài)
        originator.setState("B");
        System.out.println("更新存儲(chǔ)狀態(tài):" + originator.getState());

        // 備忘錄進(jìn)行回滾
        originator.restoreMemento(caretaker.getMemento());
        System.out.println("回滾到設(shè)置的狀態(tài):" + originator.getState());
    }
設(shè)置存儲(chǔ)狀態(tài):A
更新存儲(chǔ)狀態(tài):B
回滾到設(shè)置的狀態(tài):A

使用備忘錄模式實(shí)現(xiàn)代碼版本控制

創(chuàng)建發(fā)備忘錄角色

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

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

創(chuàng)建發(fā)起人角色

@Data
@ToString
public class GitOriginator {
    /**
     * 提交內(nèi)容
     */
    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;
    }

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

創(chuàng)建備忘錄管理員角色

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

    public CodeMemento getMemento(){
        // 移除棧頂?shù)膫渫?
        CodeMemento codeMemento = STACK.pop();
        return codeMemento;
    }

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

}

客戶端執(zhí)行

    public static void main(String[] args) {
        System.out.println("--------------------第一次創(chuàng)建代碼--------------------------------");
        // 創(chuàng)建一個(gè)備忘錄管理者
        GitCaretaker gitCaretaker = new GitCaretaker();
        // 創(chuàng)建一個(gè)備忘錄發(fā)起人
        GitOriginator gitOriginator = new GitOriginator("write code 1", "第一次提交代碼備注");
        // 創(chuàng)建一個(gè)備忘錄
        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("--------------------在第三次修改代碼基礎(chǔ)上回退到第二次提交--------------------------------");
        codeMemento = gitCaretaker.getMemento();
        gitOriginator.undoFromMemento(codeMemento);
        System.out.println("回退到第二次提交完成。代碼:" + gitOriginator.getContent() + " 備注:" + gitOriginator.getRemark());


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

到此,相信大家對(duì)“java備忘錄模式怎么實(shí)現(xiàn)”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

名稱欄目:java備忘錄模式怎么實(shí)現(xiàn)
鏈接地址:http://chinadenli.net/article16/gehedg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)網(wǎng)站營(yíng)銷外貿(mào)建站網(wǎng)站排名品牌網(wǎng)站制作網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)