代码改变世界

行为类模式(六):备忘录(Memento)

2016-10-27 14:57  阿诚de窝  阅读(255)  评论(0编辑  收藏  举报

定义

在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

UML

优点

  1. 将被存储的状态放在外面,不要和关键对象混在一起,可以帮助维护内聚;
  2. 保持关键对象的数据封装;
  3. 提供了容易实现的恢复能力。

缺点

  1. 储存和恢复状态的过程可能相当耗时。

应用场景

  1. 备忘录模式用于存储状态,在java中可以使用序列化;
  2. 如果有需要提供回滚操作的需求,使用备忘录模式非常适合,比如jdbc的事务操作,文本编辑器的Ctrl+Z恢复等。

示例

使用备忘录模式备份和还原一个状态。

Java

 1 public class Main
 2 {
 3     public static void main(String[] args)
 4     {
 5         Originator originator = new Originator();
 6         originator.setState("状态1");
 7         System.out.println("初始状态:" + originator.getState());
 8         Caretaker caretaker = new Caretaker();
 9         caretaker.setMemento(originator.createMemento());
10         originator.setState("状态2");
11         System.out.println("改变后状态:" + originator.getState());
12         originator.restoreMemento(caretaker.getMemento());
13         System.out.println("恢复后状态:" + originator.getState());
14     }
15 
16     /**
17      * 发起人类,该类的内部状态需要进行备份,并提供createMemento和restoreMemento两个方法来进行备份和恢复
18      */
19     public static class Originator
20     {
21         private String state = "";
22 
23         public String getState()
24         {
25             return state;
26         }
27 
28         public void setState(String state)
29         {
30             this.state = state;
31         }
32 
33         public Memento createMemento()
34         {
35             return new Memento(this.state);
36         }
37 
38         public void restoreMemento(Memento memento)
39         {
40             this.setState(memento.getState());
41         }
42     }
43 
44     /**
45      * 备忘录类,该类仅用来记录发起人的内部状态
46      * 如果需要记录多份状态可以修改该类来进行支持
47      */
48     public static class Memento
49     {
50         private String state = "";
51 
52         public Memento(String state)
53         {
54             this.state = state;
55         }
56 
57         public String getState()
58         {
59             return state;
60         }
61 
62         public void setState(String state)
63         {
64             this.state = state;
65         }
66     }
67 
68     /**
69      * 管理类,该类用来管理指定的发起人创建的备忘录类
70      * 如果需要管理多个备忘录可以修改该类来进行支持
71      */
72     public static class Caretaker
73     {
74         private Memento memento;
75 
76         public Memento getMemento()
77         {
78             return memento;
79         }
80 
81         public void setMemento(Memento memento)
82         {
83             this.memento = memento;
84         }
85     }
86 }
View Code