备忘录模式指的是一个对象内部有一些状态需要发生改变,希望在改变过后能回到原来的状态,这个时候就需要有个备忘录,以及保存的备忘的内容。整个结构有三个角色,发起人、备忘录、管理角色,下面代码分别以 Originator、Memento、Caretaker 代表他们,下面看代码

1 上代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/**
 * 发起者,这个对象内部的 state 希望被保存,以便在将来进行撤销操作
 */
class Originator {
    private String state = "";

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public Memento createMemento() {
        return new Memento(this.state);
    }

    public void restoreMemento(Memento memento) {
        this.setState(memento.getState());
    }
}

/**
 * 备忘录,这个对象内部存放需要保存的内容
 */
class Memento {
    private String state = "";

    public Memento(String state) {
        this.state = state;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }
}

/**
 * 管理角色,由它来管理备忘录,做扩展的时候可以在这里面设置缓存
 * 比如说在里面加多个还原点
 */
class Caretaker {
    private Memento memento;

    public Memento getMemento() {
        return memento;
    }

    public void setMemento(Memento memento) {
        this.memento = memento;
    }
}

/**
 * 测试代码
 */
public class Main {
    public static void main(String[] args) {
        Originator originator = new Originator();
        originator.setState("状态 1");
        // 发起者进入 状态 1
        System.out.println("初始状态: " + originator.getState());
        Caretaker caretaker = new Caretaker();
        // 往备忘录里面写入 状态 1
        caretaker.setMemento(originator.createMemento());
        // 发起者进入 状态 2
        originator.setState("状态 2");
        System.out.println("改变后状态: " + originator.getState());
        // 发起者撤回到 状态 1
        originator.restoreMemento(caretaker.getMemento());
        System.out.println("恢复后状态: " + originator.getState());
    }
}

参考资料

  1. 23 种设计模式(15):备忘录模式