首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 設計模式:備忘錄模式完整指南與多狀態實作

     編輯:Java 相關知識

備忘錄模式屬於行為型模式,核心目的是「在不破壞封裝性前提下,捕捉並外部化物件內部狀態,以便日後恢復」。常見應用包括編輯器的復原、資料庫交易回滾、棋類遊戲悔棋等。本文從定義、角色、通用實作、多狀態多備份進階版,到優缺點與適用場景一次講透。

三大核心角色

  • Originator(發起人):建立備忘錄、記錄當前狀態、從備忘錄恢復狀態。
  • Memento(備忘錄):儲存發起人狀態,提供窄介面(給 Caretaker)與寬介面(給 Originator)。
  • Caretaker(管理者):負責保管備忘錄,不可操作或檢查內容。

通用單狀態實作

class Originator {
    private String state;
    public Memento createMemento() { return new Memento(state); }
    public void restoreMemento(Memento m) { state = m.getState(); }
    // getter/setter 略
}
class Memento {
    private final String state;
    public Memento(String s) { state = s; }
    public String getState() { return state; }
}
class Caretaker {
    private Memento memento;
    public void setMemento(Memento m) { memento = m; }
    public Memento getMemento() { return memento; }
}

進階:多狀態多備份實作(利用 Java 內省)

實務上發起人通常是 JavaBean,屬性眾多且備份點不止一個。下列程式碼示範以 Map<String,Object> 搭配 Introspector 動態備份/還原所有屬性:

class Originator {
    private String state1, state2, state3;
    // getter/setter 略
    public Memento createMemento() {
        return new Memento(BeanUtils.backupProp(this));
    }
    public void restoreMemento(Memento m) {
        BeanUtils.restoreProp(this, m.getStateMap());
    }
}
class Memento {
    private final Map<String, Object> stateMap;
    public Memento(Map<String, Object> m) { stateMap = m; }
    public Map<String, Object> getStateMap() { return stateMap; }
}
class BeanUtils {
    public static Map<String, Object> backupProp(Object bean) { /* 內省讀取所有屬性 */ }
    public static void restoreProp(Object bean, Map<String, Object> map) { /* 內省寫回 */ }
}
class Caretaker {
    private final Map<String, Memento> memMap = new HashMap<>();
    public void setMemento(String idx, Memento m) { memMap.put(idx, m); }
    public Memento getMemento(String idx) { return memMap.get(idx); }
}

優缺點與適用場景

優點缺點
提供狀態回滾機制,撤銷錯誤操作多狀態多備份時記憶體佔用大
發起人無需管理歷史狀態,符合單一職責頻繁建立備忘錄可能影響效能

適用場景:JDBC 交易回滾、文字編輯器 Ctrl+Z、棋類遊戲悔棋、表單多步驟導航回上一步等。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved