备忘录模式
备忘录模式
一、简介
备忘录模式用于保存对象当前状态并且在之后可以再次恢复到此状态。备忘录模式的实现方式需要保证被保存的对象状态不能被对象从外部访问,目的是保护好被保存的这些对象状态的完整性以及内部实现不向外暴露。
定义:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。
二、使用场景
- 需要保存一个对象在某一时刻的状态或部分状态
- 如果用一个接口来让其他对象得到这些状态将会暴露对象的实现细节并破坏对象的封装性。一个对象不希望外接直接访问其内部状态,可以通过中间对象间接访问其内部状态
三、简单实现
这里以游戏的存档、读档为例实现简单的备忘录模式。
//游戏类
public class Game{
private int points;
private String name;
private int lifeValue;
public void play(){
Log.i(TAG, "play: start "+this.name);
lifeValue--;
points++;
Log.i(TAG, "play: points "+points);
}
public void quit(){
Log.i(TAG, "quit: "+this.toString());
}
public Memo createMemo(){
Memo memo=new Memo();
memo.lifeValue=this.lifeValue;
memo.name=this.name;
memo.points=this.points;
return memo;
}
public void restore(Memo memo){
this.points=memo.points;
this.name=memo.name;
this.lifeValue=memo.lifeValue;
Log.i(TAG, "restore: "+this.toString());
}
@Override
public String toString() {
return "Game{" +
"points=" + points +
", name='" + name + '\'' +
", lifeValue=" + lifeValue +
'}';
}
}
//备忘录类
public class Memo{
private int points;
private String name;
private int lifeValue;
}
//Caretacker用来管理备忘录
public class Caretacker{
private Memo memo;
public void archive(Memo memo){
this.memo=memo;
}
public Memo getMemo(){
return memo;
}
}
public void Test(){
Game game=new Game();
game.play();
Caretacker caretacker=new Caretacker();
caretacker.archive(game.createMemo());
game.quit();
Game newGame=new Game();
newGame.restore(caretacker.getMemo());
}
我们看到在存档时并没有直接存储Game对象的状态而是通过memo对Game对象的数据进行存储然后在存储memo对象。最终对memo的存取操作则交给Caretacker来完成。
四、小结
在Android中activity在异常退出时会调用onsaveinstancestate来保存相关状态信息,之后activity重建时会调用onrestoreinstancestate恢复之前保存的信息,这里就是使用的备忘录模式
备忘录模式在不破坏封装条件下通过备忘录对象存储另一个对象内部状态的快照,在将来合适的时候把这个对象还原到原对象。
优点:
- 提供了一种可以恢复状态的机制,可以是用户能够比较方便的回到某个历史状态
- 实现了信息的封装,使得用户不需关心状态的保存细节
缺点:
消耗资源,如果类的成员过多势必会占用比较大的资源,而每一次保存都会消耗一定内存