【Java設計模式】之備忘錄模式
阿新 • • 發佈:2019-02-16
1. 定義
備忘錄(Memento):在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態。
2. 備忘錄模式的類圖
Originator(發起人):負責建立一個備忘錄Memento,用以記錄當前時刻它的內部狀態,並可使用備忘錄恢復內部狀態。Originator可根據需要決定Memento儲存Originator的哪些內部狀態。
Memento(備忘錄):負責儲存Originator物件的內部狀態,並可防止Originator以外的其他物件訪問備忘錄Memento。備忘錄有兩個介面,Caretaker只能看到備忘錄的窄介面,它只能將備忘錄傳遞給其他物件。Originator能夠看到一個寬介面,允許它訪問返回到先前狀態所需的所有資料。
Caretaker(管理者):負責儲存好備忘錄Memento,不能對備忘錄的內容進行操作或檢查。
3. 備忘錄模式的基本程式碼
發起人類Originator:
public class Originator { private String state; //需要儲存的屬性 /** * 建立備忘錄,將需要儲存的資訊匯入並例項化出Memento物件 */ public Memento createMemento(){ return new Memento(state); } /** * 恢復備忘錄,將memento匯入並恢復相關資料 */ public void setMemento(Memento memento){ state = memento.getState(); } /** * 顯示資料 */ public void show(){ System.out.println("state="+state); } //get and set 略 }
備忘錄Menmento:
public class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
//get and set 略
}
管理者Caretaker:
public class Caretaker {
private Memento memento;
//get and set 略
}
客戶端:
public class Client { public static void main(String[] args) { //初始狀態為on Originator o = new Originator(); o.setState("on"); o.show(); //儲存狀態,隱藏了Originator的實現細節 Caretaker c = new Caretaker(); c.setMemento(o.createMemento()); o.setState("off"); o.show(); //恢復狀態 o.setMemento(c.getMemento()); o.show(); } }
4. 備忘錄模式的使用場合
Memento模式比較適用於功能比較複雜的,但需要維護或記錄屬性歷史的類,或者需要儲存的屬性只是眾多屬性中的一小部分時,Originator可以根據儲存的Memento資訊還原到前一狀態。