備忘錄模式

備忘錄模式(Memento Pattern)保存一個對象的某個狀態(tài),以便在適當的時候恢復對象。備忘錄模式屬于行為型模式。

介紹

意圖:在不破壞封裝性的前提下,捕獲一個對象的內部狀態(tài),并在該對象之外保存這個狀態(tài)。
主要解決:所謂備忘錄模式就是在不破壞封裝的前提下,捕獲一個對象的內部狀態(tài),并在該對象之外保存這個狀態(tài),這樣可以在以后將對象恢復到原先保存的狀態(tài)。
何時使用:很多時候我們總是需要記錄一個對象的內部狀態(tài),這樣做的目的就是為了允許用戶取消不確定或者錯誤的操作,能夠恢復到他原先的狀態(tài),使得他有"后悔藥"可吃。
如何解決:通過一個備忘錄類專門存儲對象狀態(tài)。
關鍵代碼:客戶不與備忘錄類耦合,與備忘錄管理類耦合。
應用實例: 1、后悔藥。 2、打游戲時的存檔。 3、Windows 里的 ctrl + z。 4、IE 中的后退。 5、數據庫的事務管理。
優(yōu)點: 1、給用戶提供了一種可以恢復狀態(tài)的機制,可以使用戶能夠比較方便地回到某個歷史的狀態(tài)。 2、實現(xiàn)了信息的封裝,使得用戶不需要關心狀態(tài)的保存細節(jié)。
缺點:消耗資源。如果類的成員變量過多,勢必會占用比較大的資源,而且每一次保存都會消耗一定的內存。
使用場景: 1、需要保存/恢復數據的相關狀態(tài)場景。 2、提供一個可回滾的操作。
注意事項: 1、為了符合迪米特原則,還要增加一個管理備忘錄的類。 2、為了節(jié)約內存,可使用原型模式+備忘錄模式。

實現(xiàn)

備忘錄模式使用三個類 Memento、Originator 和 CareTaker。Memento 包含了要被恢復的對象的狀態(tài)。Originator 創(chuàng)建并在 Memento 對象中存儲狀態(tài)。Caretaker 對象負責從 Memento 中恢復對象的狀態(tài)。

MementoPatternDemo,我們的演示類使用 CareTaker 和 Originator 對象來顯示對象的狀態(tài)恢復。
代碼實現(xiàn)如下:

//Memento 包含了要被恢復的對象的狀態(tài)
public class Memento {
    private String state;

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

    public String getState() {
        return state;
    }
}


import java.util.ArrayList;
import java.util.List;
//Caretaker 對象負責從 Memento 中恢復對象的狀態(tài)
public class CareTaker {
    private List<Memento> mementoList = new ArrayList<Memento>();

    public void add(Memento state){
        mementoList.add(state);
    }

    public Memento get(int index){
        return mementoList.get(index);
    }
}


//Memento 包含了要被恢復的對象的狀態(tài)
public class Originator {
    private String state;

    public void setState(String state) {
        this.state = state;
    }

    public String getState() {
        return state;
    }

    public Memento saveStateToMemento() {
        return new Memento(state);
    }

    public void getStateFromMemento(Memento Memento) {
        state = Memento.getState();
    }
}


public class MementoPatternDemo {
    public static void main(String[] args) {
        Originator originator = new Originator();
        CareTaker careTaker = new CareTaker();
        originator.setState("State #1");
        originator.setState("State #2");
        careTaker.add(originator.saveStateToMemento());
        originator.setState("State #3");
        careTaker.add(originator.saveStateToMemento());
        originator.setState("State #4");

        System.out.println("Current State: " + originator.getState());
        originator.getStateFromMemento(careTaker.get(0));
        System.out.println("First saved State: " + originator.getState());
        originator.getStateFromMemento(careTaker.get(1));
        System.out.println("Second saved State: " + originator.getState());
    }
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 定義 備忘錄模式又叫做快照模式(Snapshot Pattern)或Token模式,是對象的行為模式。 備忘錄對象...
    步積閱讀 3,139評論 0 2
  • 1. 備忘錄模式 1.1 簡介 ??備忘錄模式是一種軟件設計模式,它提供一種能將一個對象恢復到舊狀態(tài)的能力(回滾式...
    火山_6c7b閱讀 479評論 0 0
  • 1.備忘錄模式的定義及使用場景備忘錄模式是一種行為模式,該模式用于保存對象當前狀態(tài),并且在之后可以再次恢復到此狀態(tài)...
    GB_speak閱讀 492評論 0 0
  • 備忘錄模式(Memento Pattern)保存一個對象的某個狀態(tài),以便在適當的時候恢復對象。備忘錄模式屬于行為型...
    陳吉思_汗閱讀 224評論 0 0
  • 目錄 本文的結構如下: 引言 什么是備忘錄模式 模式的結構 典型代碼 代碼示例 優(yōu)點和缺點 適用環(huán)境 模式應用 一...
    w1992wishes閱讀 748評論 0 1

友情鏈接更多精彩內容