【設計模式In Java】十七、備忘錄模式

備忘錄模式

定義

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

場景

CTRL+Z一個意思,那就做一個悔棋和撤銷的功能吧。

UML類圖

在這裏插入圖片描述

代碼

memento

示例:

public class TestMemento {

    @Test
    public void test() {
        MementoManager mementoManager = new MementoManager();
        Chessman chessman = new Chessman("Q", new Coordinate(0, 0));
        mementoManager.addMemento(chessman.save());

        mementoManager.redo(chessman);
        mementoManager.undo(chessman);

        chessman.setCoordinate(new Coordinate(1, 1));
        mementoManager.addMemento(chessman.save());

        mementoManager.redo(chessman);

        mementoManager.undo(chessman);
        mementoManager.undo(chessman);
        mementoManager.redo(chessman);
        mementoManager.redo(chessman);
        mementoManager.undo(chessman);

        chessman.setCoordinate(new Coordinate(2, 2));
        mementoManager.addMemento(chessman.save());

        mementoManager.undo(chessman);
        mementoManager.undo(chessman);
        mementoManager.redo(chessman);
        mementoManager.redo(chessman);
    }

}

總結

備忘錄模式在很多軟件的使用過程中普遍存在,但是在應用軟件開發中,它的使用頻率並不太高,因爲現在很多基於窗體和瀏覽器的應用軟件並沒有提供撤銷操作。如果需要爲軟件提供撤銷功能,備忘錄模式無疑是一種很好的解決方案。在一些字處理軟件、圖像編輯軟件、數據庫管理系統等軟件中備忘錄模式都得到了很好的應用。

備忘錄模式的主要優點如下:

  • 它提供了一種狀態恢復的實現機制,使得用戶可以方便地回到一個特定的歷史步驟,當新的狀態無效或者存在問題時,可以使用暫時存儲起來的備忘錄將狀態復原。
  • 備忘錄實現了對信息的封裝,一個備忘錄對象是一種原發器對象狀態的表示,不會被其他代碼所改動。備忘錄保存了原發器的狀態,採用列表、堆棧等集合來存儲備忘錄對象可以實現多次撤銷操作。

備忘錄模式的主要缺點如下:

  • 資源消耗過大,如果需要保存的原發器類的成員變量太多,就不可避免需要佔用大量的存儲空間,每保存一次對象的狀態都需要消耗一定的系統資源。

在以下情況下可以考慮使用備忘錄模式:

  • 保存一個對象在某一個時刻的全部狀態或部分狀態,這樣以後需要時它能夠恢復到先前的狀態,實現撤銷操作。
  • 防止外界對象破壞一個對象歷史狀態的封裝性,避免將對象歷史狀態的實現細節暴露給外界對象。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章