允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。
1.当你需要创建对象状态快照来恢复其之前的状态时, 可以使用备忘录模式。
2.当直接访问对象的成员变量、 获取器或设置器将导致封装被突破时, 可以使用该模式。
/** * 编辑器 */ public class Editor { StringBuilder text = new StringBuilder(); public String getText(){ return text.toString(); } public void add(String string){ text.append(string); } /** * 创建快照 */ public Snapshot createSnapshot(){ return new Snapshot(text.toString()); } /** * 恢复快照 */ public void restoreSnapshot(Snapshot snapshot){ this.text.replace(0,text.length(),snapshot.getText()); } }
/** * 快照对象 * 应与原发器的属性保持一致(需要备份的属性),构造方法对所有属性赋值,并提供各个属性的访问方法 */ public class Snapshot { String text; public Snapshot(String text) { this.text = text; } public String getText(){ return text; } }
/** * 历史快照容器 */ public class SnapthodHolder { Stack<Snapshot> his = new Stack<>(); public void push(Snapshot snapshot){ his.push(snapshot); } public Snapshot pop(){ if(!his.isEmpty()){ return his.pop(); }else{ return null; } } }
/** * 测试备忘录 */ public class TestMomento { public static void main(String[] args) { Editor editor = new Editor(); SnapthodHolder snapthodHolder = new SnapthodHolder(); System.out.println("Editor初始值:"+editor.getText()); snapthodHolder.push(editor.createSnapshot()); editor.add("123"); System.out.println("Editor添加一次后:"+editor.getText()); snapthodHolder.push(editor.createSnapshot()); editor.add("abc"); System.out.println("Editor添加二次后:"+editor.getText()); Snapshot snapshot1= snapthodHolder.pop(); if(snapshot1 !=null) editor.restoreSnapshot(snapshot1); System.out.println("Editor进行一次撤销后:"+editor.getText()); Snapshot snapshot2= snapthodHolder.pop(); if(snapshot2 !=null) editor.restoreSnapshot(snapshot2); System.out.println("Editor进行二次撤销后:"+editor.getText()); } }
测试结果: