《Design Patterns》Memento.積跬步系列

Memento:備忘錄模式

先代碼

package h.l.demo.Memento;

/**
 * 
 * @author: Is-Me-Hl
 * @date: 2020年3月1日
 * @Description: 備忘錄模式Demo
 */
public class Memento {

	public static void main(String[] args) {
		Originator originator = new Originator();
		originator.setStateA("內部狀態A");
		originator.setStateB("內部狀態B");

		System.out.println("當前對象內部狀態:" + originator);

		// 對當前狀態進行備份
		MementoClass mementoClass = originator.createMementoClass();

		// 改變當前狀態
		originator.setStateA("內部狀態AA");
		originator.setStateB("內部狀態BB");

		// 當前狀態
		System.out.println("修改當前狀態:" + originator);

		// 對當前狀態進行還原
		originator.revert(mementoClass);

		// 還原後的狀態
		System.out.println("還原後狀態:" + originator);

	}
}

/**
 * 
 * @author: Is-Me-Hl
 * @date: 2020年3月1日
 * @Description: 發起人,負責創建一個備忘錄Memento,用於記錄當前時刻它的狀態,並可使用備忘錄模式恢復狀態
 *               該類可以決定Memento備忘錄對象存放哪些內部狀態信息
 */
class Originator {
	// 內部狀態A
	private String stateA;
	// 內部狀態B
	private String stateB;

	// 創建一個當前時刻副本
	public MementoClass createMementoClass() {
		return new MementoClass(stateA, stateB);
	}

	// 恢復指定副本
	public void revert(MementoClass mementoClass) {
		this.stateA = mementoClass.getStateA();
		this.stateB = mementoClass.getStateB();
	}

	public void setStateA(String stateA) {
		this.stateA = stateA;
	}

	public void setStateB(String stateB) {
		this.stateB = stateB;
	}

	@Override
	public String toString() {
		return "Originator [stateA=" + stateA + ", stateB=" + stateB + "]";
	}

}

/**
 * 
 * @author: Is-Me-Hl
 * @date: 2020年3月1日
 * @Description: 備忘錄:可以保存一些想要保存的信息
 */
class MementoClass {
	// 保存狀態A
	private String stateA;
	// 保存狀態B
	private String stateB;

	public MementoClass(String stateA, String stateB) {
		this.stateA = stateA;
		this.stateB = stateB;
	}

	@Override
	public String toString() {
		return "MementoClass [stateA=" + stateA + ", stateB=" + stateB + "]";
	}

	public String getStateA() {
		return stateA;
	}

	public String getStateB() {
		return stateB;
	}

}

測試結果:
在這裏插入圖片描述

後分析

  • 個人建議:寫代碼是件幸福的事,So,do it

備忘錄模式,定義是:在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態。這樣以後就可將該對象恢復到原先保存的狀態。
根據上面的代碼可以看出來,MementoClass就是負責保存某一時刻狀態的對象。這個類中的屬性可以根據我們的需要進行有選擇性、針對性的保存。該模式比較適用於功能比較複雜,但需要維護或記錄屬性歷史的類,或者需要保存的屬性只是衆多屬性中的一小部分,當角色的狀態改變時,有可能這個狀態無效,這時候就可以使用暫時存儲起來的備忘錄將狀態復原。當然這個暫時的備忘錄如果想要其比較穩定,不會因爲內存太小等因素保存失敗等,可將其保存在硬盤上。
與原型模式的差別:原型模式強調的是對象原封不動的複製/克隆,而備忘錄模式講究的是將對象中某一時刻的內部狀態備份/部分備份。
其他例子:參考自《大話設計模式》遊戲備份及回到某一個備份時刻。


注:以上文章僅是個人總結,若有不當之處,望不吝賜教

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章