1. 程式人生 > 其它 >備忘錄模式-行為型

備忘錄模式-行為型

模式的定義與特點

備忘錄(Memento)模式的定義:在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態,以便以後當需要時能將該物件恢復到原先儲存的狀態。該模式又叫快照模式。

備忘錄模式是一種物件行為型模式,其主要優點如下。

  • 提供了一種可以恢復狀態的機制。當用戶需要時能夠比較方便地將資料恢復到某個歷史的狀態。
  • 實現了內部狀態的封裝。除了建立它的發起人之外,其他物件都不能夠訪問這些狀態資訊。
  • 簡化了發起人類。發起人不需要管理和儲存其內部狀態的各個備份,所有狀態資訊都儲存在備忘錄中,並由管理者進行管理,這符合單一職責原則。

其主要缺點是:資源消耗大。如果要儲存的內部狀態資訊過多或者特別頻繁,將會佔用比較大的記憶體資源。

模式的結構與實現

備忘錄模式的核心是設計備忘錄類以及用於管理備忘錄的管理者類,現在我們來學習其結構與實現。

1. 模式的結構

備忘錄模式的主要角色如下。

  1. 發起人(Originator)角色:記錄當前時刻的內部狀態資訊,提供建立備忘錄和恢復備忘錄資料的功能,實現其他業務功能,它可以訪問備忘錄裡的所有資訊。
  2. 備忘錄(Memento)角色:負責儲存發起人的內部狀態,在需要的時候提供這些內部狀態給發起人。
  3. 管理者(Caretaker)角色:對備忘錄進行管理,提供儲存與獲取備忘錄的功能,但其不能對備忘錄的內容進行訪問與修改。

備忘錄模式的結構圖如圖 1 所示。

package net.biancheng.c.memento;

public class MementoPattern {
    public static void main(String[] args) {
        Originator or = new Originator();
        Caretaker cr = new Caretaker();
        or.setState("S0");
        System.out.println("初始狀態:" + or.getState());
        cr.setMemento(or.createMemento()); //儲存狀態
        or.setState("S1");
        System.out.println("新的狀態:" + or.getState());
        or.restoreMemento(cr.getMemento()); //恢復狀態
        System.out.println("恢復狀態:" + or.getState());
    }
}

//備忘錄
class Memento {
    private String state;

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

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

    public String getState() {
        return state;
    }
}

//發起人
class Originator {
    private String state;

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

    public String getState() {
        return state;
    }

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

    public void restoreMemento(Memento m) {
        this.setState(m.getState());
    }
}

//管理者
class Caretaker {
    private Memento memento;

    public void setMemento(Memento m) {
        memento = m;
    }

    public Memento getMemento() {
        return memento;
    }
}