应用场景也比较明确和有限,主要是用来防丢失、撤销、恢复等。

备忘录模式的原理与实现

备忘录模式,也叫快照(Snapshot)模式,英文翻译是 Memento Design Pattern。

在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态。

利用栈:

  1. public class InputText {
  2. private StringBuilder text = new StringBuilder();
  3. public String getText() {
  4. return text.toString();
  5. }
  6. public void append(String input) {
  7. text.append(input);
  8. }
  9. public Snapshot createSnapshot() {
  10. return new Snapshot(text.toString());
  11. }
  12. public void restoreSnapshot(Snapshot snapshot) {
  13. this.text.replace(0, this.text.length(), snapshot.getText());
  14. }
  15. }
  16. public class Snapshot {
  17. private String text;
  18. public Snapshot(String text) {
  19. this.text = text;
  20. }
  21. public String getText() {
  22. return this.text;
  23. }
  24. }
  25. public class SnapshotHolder {
  26. private Stack<Snapshot> snapshots = new Stack<>();
  27. public Snapshot popSnapshot() {
  28. return snapshots.pop();
  29. }
  30. public void pushSnapshot(Snapshot snapshot) {
  31. snapshots.push(snapshot);
  32. }
  33. }
  34. public class ApplicationMain {
  35. public static void main(String[] args) {
  36. InputText inputText = new InputText();
  37. SnapshotHolder snapshotsHolder = new SnapshotHolder();
  38. Scanner scanner = new Scanner(System.in);
  39. while (scanner.hasNext()) {
  40. String input = scanner.next();
  41. if (input.equals(":list")) {
  42. System.out.println(inputText.toString());
  43. } else if (input.equals(":undo")) {
  44. Snapshot snapshot = snapshotsHolder.popSnapshot();
  45. inputText.restoreSnapshot(snapshot);
  46. } else {
  47. snapshotsHolder.pushSnapshot(inputText.createSnapshot());
  48. inputText.append(input);
  49. }
  50. }
  51. }
  52. }

如何优化内存和时间消耗?

低频率全量备份”和“高频率增量备份”相结合的方法。