定义:
又称为快照模式,Token模式
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样就可以恢复
角色:
- 发起者:相当于游戏,记录当前内部状态,负责定义那些属于备份范围的状态,负责创建和恢复备忘的数据
- 备忘录:档内容,存储发起人的内部状态,在需要时提供需要的状态
- 负责人:增档,读档,删档,对备忘录角色进行管理
场景:
- 需要保存和恢复数据的相关状态场景
- 提供一个可回滚操作
- 监控副本场景
注意:
- 备忘录生命周期
- 备忘录性能(控制不了备忘录建立对象的数量)(大对象的建立)
实例:备份数据 (我修改了框架,可能不是正宗的备忘录模式,但是我感觉这样写,很舒服)
package 备忘录模式;
public class Document {
// String content; //备份
String now; //当前
int bbh;
VersionControlSystem versionControlSystem = new VersionControlSystem();
public Document(String nowString){
this.now = nowString;
}
public void bf(Backup backup) {
System.out.println("备份");
now = backup.content;
bbh = backup.version;
versionControlSystem.addbf(backup);
}
public void hf(int i) {
System.out.println("恢复");
Backup backup = versionControlSystem.get(i);
now = backup.content;
bbh = backup.version;
}
public String toString() {
System.out.println();
return "当前内容:"+now+" 版本号"+bbh;
}
}
package 备忘录模式;
public class Backup {
String content;
int version;
public Backup(String con,int ver) {
this.content = con;
this.version = ver;
}
}
package 备忘录模式;
import java.util.LinkedList;
public class VersionControlSystem {
LinkedList<Backup> list = new LinkedList<Backup>();
public void addbf(Backup backup) {
list.add(backup);
}
public Backup get(int versonString) {
for(Backup b:list){
if(b.version == versonString){
return b;
}
}
return null;
}
public Backup getLastVerson() {
return list.getLast();
}
public void removebf(int verString) {
for(Backup b:list){
if(b.version == verString){
list.remove(b);
}
}
}
}
package 备忘录模式;
public class Main {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Document document = new Document("策略模式");
Backup backup = new Backup(document.now, 100);
document.bf(backup);
System.out.println(document.toString());
backup = new Backup("策略模式1.0", 101);
document.bf(backup);
System.out.println(document.toString());
document.hf(100);
System.out.println(document.toString());
}
}
备份
当前内容:策略模式 版本号100
备份当前内容:策略模式1.0 版本号101
恢复当前内容:策略模式 版本号100