備忘錄模式(Memento)

jdon發表於2019-07-18

情節:如果再給我一次機會。。。

定義:在不破壞封閉的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態。

結構圖:


public class GameRole {
	public int vit;
	public int atk;
	public int defense;
	
	public int getVit() {
		return vit;
	}
	public void setVit(int vit) {
		this.vit = vit;
	}
	public int getAtk() {
		return atk;
	}
	public void setAtk(int atk) {
		this.atk = atk;
	}
	public int getDefense() {
		return defense;
	}
	public void setDefense(int defense) {
		this.defense = defense;
	}
	public void StateDisplay(){
		System.out.println("VIT"+this.vit);
		System.out.println("ATK"+this.atk);
		System.out.println("DEFENSE"+this.defense);
	}
	public void GetInitState(){
		this.atk = 100;
		this.defense = 100;
		this.vit = 100;
	}
	public void Fight(){
		this.atk = 0;
		this.defense = 0;
		this.vit = 0;
	}
	//儲存角色狀態
	public Memento SaveState(){
		return new Memento(vit, atk, defense);
	}
	//恢復角色狀態
	public void RecoveryState(Memento memento){
		this.atk = memento.atk;
		this.defense = memento.defense;
		this.vit = memento.vit;
	}
}

public class Memento {
	//體力,攻擊力,防禦力
	public int vit;
	public int atk;
	public int defense;
	
	public Memento(int vit, int atk, int defense) {
		super();
		this.vit = vit;
		this.atk = atk;
		this.defense = defense;
	}
	public int getVit() {
		return vit;
	}
	public void setVit(int vit) {
		this.vit = vit;
	}
	public int getAtk() {
		return atk;
	}
	public void setAtk(int atk) {
		this.atk = atk;
	}
	public int getDefense() {
		return defense;
	}
	public void setDefense(int defense) {
		this.defense = defense;
	}	
}

public class Caretaker {
	private Memento memento;

	public Memento getMemento() {
		return memento;
	}
	
	public void setMemento(Memento memento) {
		this.memento = memento;
	}
}

public class Client {
	public static void main(String[] args) {
		//大戰前
		GameRole xiaoRole = new GameRole();
		xiaoRole.GetInitState();
		xiaoRole.StateDisplay();
		//儲存進度
		Caretaker stateAdmin = new Caretaker();
		stateAdmin.setMemento(xiaoRole.SaveState());
		//大戰時
		xiaoRole.Fight();
		xiaoRole.StateDisplay();
		//恢復之前狀態
		xiaoRole.RecoveryState(stateAdmin.getMemento());
		xiaoRole.StateDisplay();
	}
}

        把要儲存的細節封裝在Memento中,哪一天要更改儲存的細節就不用影響客戶端了

        比較適用於功能比較複雜的,但需要維護或記錄屬性歷史的類;需要儲存的屬性只是眾多屬性的一小部分時,Originator可以根據儲存的Memento資訊還原到前一狀態。

相關文章