1. 程式人生 > >Java設計模式----備忘錄模式

Java設計模式----備忘錄模式

tro 過程 根據 訪問 hashmap 捕獲 tom take demo

電子遊戲過去都會有一個“記錄”或者“存盤”的功能,就是當玩家在遊戲過程中將當前的遊戲狀態記錄下來,以便於之後重新登錄遊戲後讀取到記錄時的狀態。這種將對象的狀態先保存起來,以後再根據保存的數據恢復對象狀態的設計模式,就是備忘錄模式。


1. 備忘錄模式

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

備忘錄模式的UML類圖為:

技術分享圖片

  • Originator: 發起人,負責創建一個Memento對象,以記錄它當前的內部狀態。Originator可以根據需要,決定Memento保存哪些內部狀態;
  • Memento:備忘錄, 保存Originator的內部狀態,並防止其它對象訪問Originator的狀態;
  • Caretaker:管理者, 負責保存Memento對象列表,將Memento對象保存在一個聚合對象中,恢復時可以獲取Memento。

2. 代碼實現

假設在玩一款遊戲, Orininator 狀態state, 代表當前對象的血量。備忘錄定義Originator的靜態內部類。

class Originator {
    private String state;

    public void setState(String state) {
        
this.state = state; } public String getState() { return this.state; } /** * 保存當前狀態到備忘錄 */ public Memento saveToMemento() { System.out.println("Saving current state: " + state); return new Memento(this.state); } /** * 讀取備忘錄,恢復保存的狀態
*/ public void restoreState(Memento memento) { System.out.println("Restore state"); this.state = memento.getSavedState(); } /** * 備忘錄,存儲當前Originator狀態 */ public static class Memento { final String state; public Memento(String s) { this.state = s; } public String getSavedState() { return this.state; } } }

管理備忘錄

/**
 * 管理者
 */
class Caretaker {
    private final Map<String, Originator.Memento> mementoMap = new HashMap<>();

    /**
     * 保存狀態
     */
    public synchronized void addMemento(String id, Originator.Memento memento) {
        mementoMap.put(id, memento);
    }

    /**
     * 讀取狀態
     */
    public synchronized Originator.Memento getMemento(String id) {
        return mementoMap.get(id);
    }

    /**
     * 刪除狀態
     */
    public synchronized Originator.Memento deleteMemento(String id) {
        return mementoMap.remove(id);
    }

}

演示

public class MementoDemo {
    public static void main(String[] args) {
        Caretaker caretaker = new Caretaker();
        Originator originator = new Originator();
        //設置狀態:滿血
        originator.setState("Full Blood");
        //保存當前狀態
        caretaker.addMemento("1",originator.saveToMemento());

        //狀態改變:半血
        originator.setState("Half Blood");
        System.out.println(originator.getState());
        //讀取保存狀態
        originator.restoreState(caretaker.getMemento("1"));
        System.out.println(originator.getState());

    }

}

運行結果

Saving current state: Full Blood
Half Blood
Restore state
Full Blood

Java設計模式----備忘錄模式