概念:
备忘录模式: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