20.Memento-備忘錄模式

Memento 備忘錄模式

  • 備忘錄模式:
    在不破壞封裝的前提下,捕獲一個對象的內部狀態,並在該對象以外保存這個狀態,
    這樣能夠在之後將對象恢復到原先保存的狀態。它是一種對象行爲型模式,其別名爲Token。java

  • 結構圖:
    Memento_structure編程

  • 示例類圖:
    Memento_umlmarkdown

  • 示例代碼:編程語言

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 Memento {
    private String state;

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

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

public class CareTaker {
    private List<Memento> mementos = new ArrayList<Memento>();

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

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

// 測試
public class MementoTest {

    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());
    }
}
  • 角色:測試

    1. Originator(原發器):
      它是一個普通類,能夠建立一個備忘錄,並存儲它的當前內部狀態,也能夠使用備忘錄來恢復其內部狀態,通常將須要保存內部狀態的類設計爲原發器。this

    2. Memento(備忘錄):
      存儲原發器的內部狀態,根據原發器來決定保存哪些內部狀態。備忘錄的設計通常能夠參考原發器的設計,
      根據實際須要肯定備忘錄類中的屬性。須要注意的是,除了原發器自己與負責人類以外,
      備忘錄對象不能直接供其餘類使用,原發器的設計在不一樣的編程語言中實現機制會有所不一樣。spa

    3. Caretaker(負責人):
      負責人又稱爲管理者,它負責保存備忘錄,可是不能對備忘錄的內容進行操做或檢查。
      在負責人類中能夠存儲一個或多個備忘錄對象,它只負責存儲對象,而不能修改對象,也無須知道對象的實現細節。設計

備忘錄模式提供了一種狀態恢復的實現機制,使得用戶能夠方便地回到一個特定的歷史步驟,
當新的狀態無效或者存在問題時,能夠使用存儲起來的備忘錄將狀態復原,
當前不少軟件都提供了Undo(撤銷)操做功能,就使用了備忘錄模式。code

相關文章
相關標籤/搜索