行爲型設計模式 - 備忘錄模式詳解

基本介紹

備忘錄模式(Memento Pattern):在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象以外保存這個狀態。這樣就能夠將該對象恢復到原先保存的狀態java

模式結構

Originator(發起者):記錄當前的狀態,負責建立和恢復備忘錄數據庫

Memento(備忘錄):負責存儲發起者的狀態,在須要的時候提供發起人須要的狀態瀏覽器

Caretaker(管理者):管理備忘錄數據結構

代碼演示

(這裏咱們以單角色、單狀態、單備份來演示,思想是相同的,無非是存儲數據結構上的區別)測試

備忘錄角色,定義了存儲狀態的變量,能夠根據實際需求定義對應的存儲對象this

public class Memento {
    private String state;

    public String getState() {
        return state;
    }

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

發起者角色,存儲狀態,而且能夠建立備忘錄和將狀態恢復爲備忘錄的值rest

public class Originator {
    private String state;

    public String getState() {
        return state;
    }

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

    public Memento createMemento() {
        Memento memento = new Memento();
        memento.setState(state);
        return memento;
    }

    public void restoreMemento(Memento memento) {
        this.state = memento.getState();
    }
}

管理者角色,管理了備忘錄code

public class Caretaker {
    private Memento memento;

    public Memento getMemento() {
        return memento;
    }

    public void setMemento(Memento memento) {
        this.memento = memento;
    }
}

測試類對象

public class Client {
    @Test
    public void test() {
        //設置初始狀態
        Originator originator = new Originator();
        originator.setState("狀態1");
        System.out.println("初始狀態:" + originator.getState());

        //建立管理者
        Caretaker caretaker = new Caretaker();
        caretaker.setMemento(originator.createMemento());

        //更新狀態
        originator.setState("狀態2");
        System.out.println("跟新狀態:" + originator.getState());

        //恢復狀態
        originator.restoreMemento(caretaker.getMemento());
        System.out.println("恢復狀態:" + originator.getState());
    }
}

運行結果遊戲

初始狀態:狀態1
跟新狀態:狀態2
恢復狀態:狀態1

模式分析

優勢:

  • 給用戶提供了一種能夠恢復狀態的機制,使用戶能夠比較方便的回退到某個歷史的狀態
  • 實現了信息的封裝,使用戶不須要關心備忘錄中狀態的保存細節

缺點:

  • 在實際應用中,備忘錄模式都是多狀態和多備份的,發起人角色的狀態須要存儲到備忘錄對象中,對資源的消耗是比較嚴重的,爲了節約內存,能夠配合原型模式使用

應用場景:

  • 遊戲的存檔
  • CTRL + Z 撤銷
  • 瀏覽器的後退
  • 數據庫的事務管理
  • ... ...
相關文章
相關標籤/搜索