Java設計模式----備忘錄模式
阿新 • • 發佈:2019-03-28
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設計模式----備忘錄模式