1類圖
2定義:
2.1 在不破壞封閉的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態。這樣以後就可將該對象恢復到原先保存的狀態。
3應用場景:
3.1 需要保存一個對象在某一時刻的狀態或部分狀態。
3.2 如果用一個接口來讓其他對象得到這些狀態,將會暴露對象的實現細節並破壞對象的封裝性,一個對象不希望外界直接訪問其內部狀態,通過中間對象可以間接訪問其內部狀態。
4模擬類
public class CallofDuty {
private int mCheckpoint = 1;
private int mLifeValue = 100;
private String mWeepon = "沙漠之鷹";
public void play(){
System.out.println("玩遊戲:" + String.format("第%d關", mCheckpoint) + "奮鬥殺敵中!");
mLifeValue -= 10;
System.out.println("進度升級了");
mCheckpoint++;
System.out.println("達到 " + String.format("第%d關",mCheckpoint));
}
public void quit(){
System.out.println("-----------");
System.out.println("退出當前的遊戲屬性 : " + this.toString());
System.out.println("退出遊戲");
System.out.println("-----------");
}
public Memoto createMemoto(){
Memoto memoto = new Memoto();
memoto.mCheckpoint = mCheckpoint;
memoto.mLifeValue = mLifeValue;
memoto.mWeapon = mWeepon;
return memoto;
}
public void restore(Memoto memoto){
this.mCheckpoint = memoto.mCheckpoint;
this.mLifeValue = memoto.mLifeValue;
this.mWeepon = memoto.mWeapon;
System.out.println("恢復後的遊戲屬性 : " + this.toString());
}
@Override
public String toString() {
return "CallofDuty [mCheckpoint=" + mCheckpoint + ", mLifeValue=" + mLifeValue + ", mWeepon=" + mWeepon + "]";
}
}
5創建要保存的對象類
public class Memoto {
public int mCheckpoint;
public int mLifeValue;
public String mWeapon;
@Override
public String toString() {
return "Memoto [mCheckpoint=" + mCheckpoint + ", mLifeValue=" + mLifeValue + ", mWeapon=" + mWeapon + "]";
}
}
6保存和回覆類
public class Caretaker {
Memoto memoto;
public void archive(Memoto memoto){
this.memoto = memoto;
}
public Memoto getMemoto() {
return memoto;
}
}
7測試
public class Client {
public static void main(String[] args) {
CallofDuty game = new CallofDuty();
game.play();
Caretaker caretaker = new Caretaker();
caretaker.archive(game.createMemoto());
game.quit();
CallofDuty newGame = new CallofDuty();
newGame.restore(caretaker.getMemoto());
}
}