文章目录
  1. 1. 备忘录模式 Memento
    1. 1.1. 问题:
    2. 1.2. 意图:
    3. 1.3. 代码
  2. 2. 小结

说的通俗点,就是备份,与一键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:需要存档的游戏数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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:存档管理器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* @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:客户端调用

1
2
3
4
5
6
7
8
9
10
11
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 + ZCtrl + Y这样的功能,不然一般不会使用。

  • 利弊影响:
    哦,其实这个写成API后还是很好用,但就怕元数据有变化啊。

文章目录
  1. 1. 备忘录模式 Memento
    1. 1.1. 问题:
    2. 1.2. 意图:
    3. 1.3. 代码
  2. 2. 小结