說在開頭:其實我個人並不認爲這是什麼設計模式...因爲完全沒有什麼價值嘛,不過既然多本書上對其有介紹,那我還是寫一下吧!
備忘錄模式是用來實現 備份,還原 的一種代碼組織結構; 什麼時候需要備份還原呢?非常常見的是遊戲中的保存進度, 打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,就寫這麼多吧,實在沒什麼好些的...