备忘录模式memorandum

备忘录模式主要是用于来防丢失、撤销、恢复等场景,定义是:在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态。

需要三个类, Memento 类提供保存对象和得到对象的方法, Originator 类利用 Memento 类提供保存和读取自身状态的方法,Caretaker 类来记录所有的备份。

维基百科 的例子贴过来。

1import java.util.List;
2import java.util.ArrayList;
3class Originator {
4    private String state;
5    // The class could also contain additional data that is not part of the
6    // state saved in the memento..
7
8    public void set(String state) {
9        this.state = state;
10        System.out.println("Originator: Setting state to " + state);
11    }
12
13    public Memento saveToMemento() {
14        System.out.println("Originator: Saving to Memento.");
15        return new Memento(this.state);
16    }
17
18    public void restoreFromMemento(Memento memento) {
19        this.state = memento.getSavedState();
20        System.out.println("Originator: State after restoring from Memento: " + state);
21    }
22
23    public static class Memento {
24        private final String state;
25
26        public Memento(String stateToSave) {
27            state = stateToSave;
28        }
29
30        // accessible by outer class only
31        private String getSavedState() {
32            return state;
33        }
34    }
35}
36
37class Caretaker {
38    public static void main(String[] args) {
39        List<Originator.Memento> savedStates = new ArrayList<Originator.Memento>();
40
41        Originator originator = new Originator();
42        originator.set("State1");
43        originator.set("State2");
44        savedStates.add(originator.saveToMemento());
45        originator.set("State3");
46        // We can request multiple mementos, and choose which one to roll back to.
47        savedStates.add(originator.saveToMemento());
48        originator.set("State4");
49
50        originator.restoreFromMemento(savedStates.get(1));
51    }
52}