1. 程式人生 > >【Java設計模式】之備忘錄模式

【Java設計模式】之備忘錄模式

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資訊還原到前一狀態。