说的通俗点,就是备份,与一键GOHST备份不同,备忘录模式只备份数据,不备份程序本身哦~
备忘录模式 Memento
备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。
问题:
Need to restore an object back to its previous state (e.g. “undo” or “rollback” operations).
意图:
- Without violating encapsulation, capture and externalize an object’s internal state so that the object can be returned to this state later.
- A magic cookie that encapsulates a “check point” capability.
- Promote undo or rollback to full object status.
代码
例:从介绍上来看,很好理解,创建一个快照对象(不是搜索引擎的那种啊),当后面有操作失误时可以undo或者rollback.比如SQL一般运行时都会每天自动备份一次或多次,如果数据出了问题都可以回去的,还有就是玩游戏的存档,就是一个典型的备忘录模式,想休息时先存个档~~
代码1:需要存档的游戏数据
import java.util.ArrayList;
import java.util.List;
//假设我玩游戏只有血量和经验两个数据保存
public class Record {
public int hp;
public int exp;
public int getHp() {
return hp;
}
public void setHp(int hp) {
this.hp = hp;
}
public int getExp() {
return exp;
}
public void setExp(int exp) {
this.exp = exp;
}
}
代码2:存档管理器
/**
* @author xdnote.com
* 存档管理器
* */
public class RecordManager {
private static List<Record> records =new ArrayList<Record>();
//存档,一般当然是存文件而不是内存啦
public static void saveRecord(Record record){
records.add(record);
}
//恢复最近的存档
public static Record storeRecentRecord(){
return records.get(records.size()-1);
}
}
代码3:客户端调用
public static void main(String[] args){
Record record = new Record();
record.setHp(500);
record.setExp(9800);
RecordManager.saveRecord(record);
//又完了一会,人物变强了,可但蛋疼的停电了
Record recentRecord = RecordManager.storeRecentRecord();
System.out.println(recentRecord.getExp());
}
小结
备忘录模式 Memento
使用频率:
低
除非业务上有Ctrl + Z 与Ctrl + Y 这样的功能,不然一般不会使用。利弊影响:
中
哦,其实这个写成API后还是很好用,但就怕元数据有变化啊。