概念:
备忘录模式:Without violating encapsulation, capture and externalize an object's internal state so that the object can be restored to this state later. 在不破坏封装性的前提下,捕获一个对象内部的状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存的状态。
实现:
需要备份的对象
public class Document {
public Document(String name, String content) {
this.name = name;
this.content = content;
}
private String name;//文件名称一般不需要备份
private String content;//文件内容一般需要备份
public Backup backup() {
System.out.println("文件被保存备份");
return new Backup(this);
}
public void recover(Backup backup) {
System.out.println("文件被还原");
this.content = backup.getContent();
}
/*
为了测试,这里重写toString方法
*/
@Override
public String toString() {
return "Document{" +
"name='" + name + '\'' +
", content='" + content + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
备份对象
public class Backup {
public Backup(Document document) {
this.content = document.getContent();
}
private String content;
private Integer versionNo;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Integer getVersionNo() {
return versionNo;
}
public void setVersionNo(Integer versionNo) {
this.versionNo = versionNo;
}
}
备份管理
public class VersionControl {
List<Backup> list = new ArrayList<>();
Integer versionNo = 0;
public void addBackup(Backup backup){
backup.setVersionNo(versionNo++);
list.add(backup);
}
public Backup get(Integer versoin){
for(Backup backup : list){
if(backup.getVersionNo().equals(versoin)){
return backup;
}
}
return null;
}
}
测试及结果:
@Test
public void mementoTest(){
Document document = new Document("测试文档","没有备份前的内容");
VersionControl versionControl = new VersionControl();
versionControl.addBackup(document.backup());
System.out.println(document);
document.setContent("第一次修改,并且要保存。");
versionControl.addBackup(document.backup());
System.out.println(document);
document.recover(versionControl.get(0));
System.out.println(document);
}
文件被保存备份
Document{name='测试文档', content='没有备份前的内容'}
文件被保存备份
Document{name='测试文档', content='第一次修改,并且要保存。'}
文件被还原
Document{name='测试文档', content='没有备份前的内容'}
分析:
1.备忘录模式的备份是将数据备份在缓存中,所以不建议大量的是备份对象。
2.同时需要注意备份管理的生命周期,如果在使用中,应避免因线程或者别的某些机制导致引用失效。如果不使用应尽早删除引用,等待垃圾回收器回收对象,节省资源。
来源:https://www.cnblogs.com/ben-mario/p/11134049.html