Java設計模式之10——備忘錄模式(1)
備忘錄模式是一種行為模式,用於儲存物件當前狀態。在之後可以再次恢復狀態。在不破壞封閉的前提下,捕獲一個物件的內部狀態,並在該物件外儲存這個狀態,這樣,以後就可以將該物件恢復到以前的狀態。
使用場景:(1) 需要儲存一個物件在某一時刻的狀態或者部分狀態。
(2) 如果使用一個介面來讓其他物件得到這些狀態,將會暴露物件的篩選細節,並破壞物件的封裝性;一個物件不希望外界直接訪問其內部狀態,通過中間物件可以間接訪問其內部狀態。
1 建立一個備忘錄類:
package momentopatttern;
/**
* 作為 備忘錄
*/
public class Memoto {
public int mCheckPoint ;
public int mLifeValue ;
public String mWeapon ;
@Override
public String toString() {
return "Memoto [mCheckPoint=" + mCheckPoint + ", mLifeValue="
+ mLifeValue + ", mWeapon=" + mWeapon + "]";
}
}
2 建立一種狀態:
package momentopatttern;
/**
* 相當於 originator
*/
public class CallOfDutyGame {
private int mCheckPoint = 1;
private int mLifeValue = 100;
private String mWeapon = "沙漠之鷹";
/**
* 玩遊戲
*/
public void play(){
System.out.println("開始玩遊戲-------" + this);
mLifeValue -=10;
mCheckPoint++;
System.out.println("開始玩遊戲 屬性變化= "+this.toString());
}
/**
* 退出遊戲
*/
public void quit(){
System.out.println("退出遊戲-----"+this.toString());
}
/**
* 建立備忘錄
* @return
*/
public Memoto creatMemotoeMemoto(){
Memoto memoto = new Memoto();
memoto.mCheckPoint = mCheckPoint;
memoto.mLifeValue = mLifeValue;
memoto.mWeapon = mWeapon;
return memoto;
}
/**
* 恢復遊戲
* @param memoto
*/
public void restore(Memoto memoto){
mCheckPoint = memoto.mCheckPoint;
mLifeValue = memoto.mLifeValue;
mWeapon = memoto.mWeapon;
System.out.println("恢復後的遊戲屬性" + this.toString());
}
@Override
public String toString() {
return "CallOfDutyGame [mCheckPoint=" + mCheckPoint + ", mLifeValue="
+ mLifeValue + ", mWeapon=" + mWeapon + "]";
}
}
3 備忘錄管理者:
package momentopatttern;
/**
* 管理備忘錄 唯一改變備忘錄的入口
*/
public class Caretaker {
Memoto memoto;
public Memoto getMemoto() {
return memoto;
}
public void setMemoto(Memoto memoto) {
this.memoto = memoto;
}
}
4 測試類:
package momentopatttern;
public class Client {
public static void main(String[] args) {
// 建立遊戲物件
CallOfDutyGame game = new CallOfDutyGame();
// 打遊戲
game.play();
// 建立備忘錄管理者
Caretaker caretaker = new Caretaker();
// 遊戲狀態存檔
caretaker.setMemoto(game.creatMemotoeMemoto());
// 退出遊戲
game.quit();
// 恢復遊戲
CallOfDutyGame game2 = new CallOfDutyGame();
game2.restore(caretaker.getMemoto());
}
}