定义
在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样,以后就可将该对象恢复到原先保存的状态。
Android中源码使用备忘录模式
onSaveInstanceState和onRestoreInstanceState
特点
-
优点
(1)给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史状态。
(2)实现了信息的封装,使用户不需要关心状态的保存细节。 -
缺点
消耗资源,如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
使用场景
(1)需要保存一个对象在某一个时刻的状态或部分状态。
(2)如果用一个接口来让其他对象得到这些状态,将会暴露对象的实现细节并破坏对象的封装性,一个对象不希望外界直接访问其内部状态,通过中间对象可以间接访问其内部状态。
简单实现
需求:”使命召唤”游戏
1.备忘录类
/**
* Created on 2019/4/12 10:07
*
* 备忘录类
*
* @author Scarf
*/
public class Memento {
public int mCheckpoint; //武器
public int mLiftValue; //生命
public String mWeapon; //关卡
@Override
public String toString() {
return "Memento{" +
"mCheckpoint=" + mCheckpoint +
", mLiftValue=" + mLiftValue +
", mWeapon='" + mWeapon + '\'' +
'}';
}
}
- 游戏类
/**
* Created on 2019/4/12 10:11
*
* @author Scarf
*/
public class CallOfDuty {
private int mCheckpoint = 1;
private int mLifeValue = 100;
private String mWeapon = "沙漠之鹰";
public Memento createMemento() {
Memento memento = new Memento();
memento.mCheckpoint = mCheckpoint;
memento.mLiftValue = mLifeValue;
memento.mWeapon = mWeapon;
return memento;
}
public void play() {
Log.d("TAG", "玩游戏: " +String.format("第 %d 关",mCheckpoint)+"奋战杀敌中。");
mLifeValue -= 10;
Log.d("TAG", "进度升级了 ");
mCheckpoint++;
Log.d("TAG", "到达" + String.format("第 %d 关",mCheckpoint));
}
public void quit() {
Log.d("TAG", "退出当前游戏,属性:" + this.toString());
}
public void restore(Memento memento) {
this.mCheckpoint = memento.mCheckpoint;
this.mLifeValue = memento.mLiftValue;
this.mWeapon = memento.mWeapon;
Log.d("TAG", "恢复后的游戏属性:" + this.toString());
}
@Override
public String toString() {
return "CallOfDuty{" +
"mCheckpoint=" + mCheckpoint +
", mLifeValue=" + mLifeValue +
", mWeapon='" + mWeapon + '\'' +
'}';
}
}
- 操作类
/**
* Created on 2019/4/12 10:21
*
* @author Scarf
*/
public class Caretaker {
Memento mMemento;
/**
* 游戏存档
* @param memento
*/
public void archive(Memento memento) {
this.mMemento = memento;
}
public Memento getMemento() {
return mMemento;
}
}
- 使用
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
}
private void initData() {
CallOfDuty game = new CallOfDuty();
//玩游戏
game.play();
Caretaker caretaker = new Caretaker();
caretaker.archive(game.createMemento()); //游戏存档
game.quit();
CallOfDuty newGame = new CallOfDuty();
newGame.restore(caretaker.getMemento()); //恢复游戏
game.play();
newGame.restore(caretaker.getMemento());
}
}
- 输出结果
2019-04-12 10:31:46 TAG: 玩游戏: 第 1 关奋战杀敌中。
2019-04-12 10:31:46 TAG: 进度升级了
2019-04-12 10:31:46 TAG: 到达第 2 关
2019-04-12 10:31:46 TAG: 退出当前游戏,属性:CallOfDuty{mCheckpoint=2, mLifeValue=90, mWeapon='沙漠之鹰'}
2019-04-12 10:31:46 TAG: 恢复后的游戏属性:CallOfDuty{mCheckpoint=2, mLifeValue=90, mWeapon='沙漠之鹰'}
2019-04-12 10:31:46 TAG: 玩游戏: 第 2 关奋战杀敌中。
2019-04-12 10:31:46 TAG: 进度升级了
2019-04-12 10:31:46 TAG: 到达第 3 关
2019-04-12 10:31:46 TAG: 恢复后的游戏属性:CallOfDuty{mCheckpoint=2, mLifeValue=90, mWeapon='沙漠之鹰'}
网友评论