第十六篇:備忘錄模式

說在開頭:其實我個人並不認爲這是什麼設計模式...因爲完全沒有什麼價值嘛,不過既然多本書上對其有介紹,那我還是寫一下吧!

備忘錄模式是用來實現 備份,還原 的一種代碼組織結構;  什麼時候需要備份還原呢?非常常見的是遊戲中的保存進度, 打BOSS前需要先將當前進度保存一下,等到一不小心掛了,還可以馬上恢復到打BOSS前...不然得江湖再見一切重頭開始,那該多蛋疼???


那好,我們就以遊戲爲例寫一段代碼吧!

//遊戲角色
class Role{
	//攻擊點數
	private int attackCount;
	//防禦點數
	private int defenceForcesCount;
	//經驗數
	private int experieceCount;
	//精力//該數是不需要存檔的...
	private int vigorCount;
	public int getAttackCount() {
		return attackCount;
	}
	public void setAttackCount(int attackCount) {this.attackCount = attackCount;}
	public int getDefenceForcesCount() {return defenceForcesCount;}
	public void setDefenceForcesCount(int defenceForcesCount) {this.defenceForcesCount = defenceForcesCount;}
	public int getExperieceCount() {return experieceCount;}
	public void setExperieceCount(int experieceCount) {this.experieceCount = experieceCount;}
	public int getVigorCount() {return vigorCount;}
	public void setVigorCount(int vigorCount) {this.vigorCount = vigorCount;}
	
	@Override
	public String toString() {
		return "Role [attackCount=" + attackCount + ", defenceForcesCount="
				+ defenceForcesCount + ", experieceCount=" + experieceCount
				+ ", vigorCount=" + vigorCount + "]";
	}
	
}

//備份數據管理者接口,也就是存檔位置,
//我們在單機遊戲中不是可以看到多個存檔點麼,我們可以自由選擇存檔點嘛!
interface Director{
	//備份
	void preserve(Role role );
	//讀取存檔點還原
	Role rollBack();
}
//存檔位置1
class DirectorOne implements Director{
	
	private Role role;
	@Override
	public void preserve(Role role) {
		this.role = role;
	}
	@Override
	public Role rollBack() {
		return this.role;
	}
}

//備份幫助者對象,這裏注意一下,其實我們可以直接對Role對象進行克隆,完全複製一份進行保存而不要這個對象,
//之所以一個個屬性去get and set,是因爲可能有某些值是不需要備份的,比如精力
class BackHelper{
	/***
	 * 進行備份的地方
	 * @param role 要備份的角色
	 * @param director 要備份到那個存檔點
	 */
	public void preserve( Role role,Director director){
		Role newRole = new Role();
		newRole.setAttackCount(role.getAttackCount());
		newRole.setDefenceForcesCount(role.getDefenceForcesCount());
		newRole.setExperieceCount(role.getExperieceCount());
		director.preserve(newRole);
	}
}


最後來測試一下:

public class Test {
	public static void main(String[] args) {
		Role role = new Role();
		role.setAttackCount(10);
		role.setDefenceForcesCount(88);
		role.setExperieceCount(100);
		role.setVigorCount(72);
		System.out.println(role);
		//備份一下,保存到存檔點
		Director director = new DirectorOne();
		BackHelper backHelper = new BackHelper();
		backHelper.preserve(role, director);
		
		//戴上了某件超強裝備,改變攻擊力
		role.setAttackCount(10000);
		System.out.println(role);
		
		//打BOSS死了,重新讀檔
		role = director.rollBack();
		System.out.println(role);
	}
}


輸出******************************************************************

Role [attackCount=10, defenceForcesCount=88, experieceCount=100, vigorCount=72]
Role [attackCount=10000, defenceForcesCount=88, experieceCount=100, vigorCount=72]
Role [attackCount=10, defenceForcesCount=88, experieceCount=100, vigorCount=0]

***********************************************************************

Ok,就寫這麼多吧,實在沒什麼好些的...

發佈了48 篇原創文章 · 獲贊 5 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章