什么是备忘录模式
在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态。
需求
编写一个小程序,可以接收命令行的输入。用户输入文本时,程序将其追加存储在内存文本中;用户输入“:list”,程序在命令行中输出内存文本的内容;用户输入“:undo”,程序会撤销上一次输入的文本,也就是从内存文本中将上次输入的文本删除掉。
实现
//输入文本 public class InputText { private StringBuilder text = new StringBuilder(); public String getText() { return text.toString(); } public void append(String input) { text.append(input); } //创建快照 public Snapshot createSnapshot() { return new Snapshot(text.toString()); } //根据快照还原对象 public void restoreSnapshot(Snapshot snapshot) { this.text.replace(0, this.text.length(), snapshot.getText()); } } //快照类 public class Snapshot { private String text; public Snapshot(String text) { this.text = text; } public String getText() { return this.text; } } //备忘录 public class SnapshotHolder { private Stack<Snapshot> snapshots = new Stack<>(); public Snapshot popSnapshot() { return snapshots.pop(); } public void pushSnapshot(Snapshot snapshot) { snapshots.push(snapshot); } } public class ApplicationMain { public static void main(String[] args) { //存储输入文本 InputText inputText = new InputText(); //备忘录 SnapshotHolder snapshotsHolder = new SnapshotHolder(); Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { String input = scanner.next(); //list 输出 字符 if (input.equals(":list")) { System.out.println(inputText.toString()); //undo 还原上一个版本 } else if (input.equals(":undo")) { //获得快照 Snapshot snapshot = snapshotsHolder.popSnapshot(); //根据快照还原 inputText.restoreSnapshot(snapshot); } else { //创建快照 并写入备忘录 snapshotsHolder.pushSnapshot(inputText.createSnapshot()); //追加字符 inputText.append(input); } } } }