一、定义:备忘录(memento)模式又叫快照(snapshot)模式或者token模式,主要功能:
备忘录模式是用一个对象来存储另外一个对象的内部状态的快照,实现备忘录模式的关键点是在不破坏封装的
情况下,将一个对象的状态捕捉住,并外部化,存储起来,从而可以在合适的时候,把这个对象还原。
说明:备忘录模式适模式中比较好理解的一个,这里就不举例子,但是备忘录模式是模式中实现比较难,或者说
实现比较巧的,这里主要说说。
二、备忘录模式的实现
1,备忘录模式中的角色
发起人:创建含有内部状态的备忘录对象,并使用备忘录对象存储状态
负责人:负责人保存备忘录对象,但不检查备忘录对象的内容
备忘录:备忘录对象将发起人对象的内部状态存起来,并保正其内容不被发起人对象之外的对象像读取
注意:在备忘录的角色中,定义了他必须对不同的人提供不同的接口,对发起人提供宽接口,对其它任何人提供窄
接口。也许你说我都提供宽接口得了。对这也是备忘录的一种实现,叫做白箱备忘录,不过这种方法的封装没有设计
好,安全性不够好。
2,白箱备忘录的实现:
白箱的缺点:上边说了,破坏了封装,安全性有些问题。
说明:这里白箱的实现只保存了一个状态,其实是可以保存多个状态的。
3,双接口的实现,宽窄接口(黑箱)
如何实现宽窄接口呢,内部类也许是个好方法。我们把备忘录类设计"成发起人"的内部类,但这样还有的问题是同一
package中的其它类也能访问到,为了解决这个问题,我们可以把"备忘录"的方法设计成私有的方法,这样就
可以保正封装,又保正发起人能访问到。实现如下:
定义窄接口.
三,最后的一些说明:
1,
备忘录模式是用一个对象来存储另外一个对象的内部状态的快照,实现备忘录模式的关键点是在不破坏封装的
情况下,将一个对象的状态捕捉住,并外部化,存储起来,从而可以在合适的时候,把这个对象还原。
说明:备忘录模式适模式中比较好理解的一个,这里就不举例子,但是备忘录模式是模式中实现比较难,或者说
实现比较巧的,这里主要说说。
二、备忘录模式的实现
1,备忘录模式中的角色
发起人:创建含有内部状态的备忘录对象,并使用备忘录对象存储状态
负责人:负责人保存备忘录对象,但不检查备忘录对象的内容
备忘录:备忘录对象将发起人对象的内部状态存起来,并保正其内容不被发起人对象之外的对象像读取
注意:在备忘录的角色中,定义了他必须对不同的人提供不同的接口,对发起人提供宽接口,对其它任何人提供窄
接口。也许你说我都提供宽接口得了。对这也是备忘录的一种实现,叫做白箱备忘录,不过这种方法的封装没有设计
好,安全性不够好。
2,白箱备忘录的实现:
1
public class Originator
{
2
private String state;
3
public Memento CreateMemento()
{
4
return new Memento(state);
5
}
6
public void restoreMemento(Memento memento)
{
7
this.state = memento.getState();
8
}
9
public String getState()
{
10
return this.state;
11
}
12
public void setState(String state)
{
13
this.state=state;
14
System.out.println("Current state = " + this.state);
15
}
16
}
17
public class Memento
{
18
private String state;
19
public Memento(String state)
{
20
this.state = state;
21
}
22
public String getState()
{
23
return this.state;
24
}
25
public void setState()
{
26
this.state = state;
27
}
28
}
29
public class Caretaker
{
30
private Memento memento;
31
public Memento retrieveMemento()
{
32
return this.memento;
33
}
34
public void saveMemento(Memento memento)
{
35
this.memento = memento;
36
}
37
}
38
public class Client
{
39
private static Originator o = new Originator();
40
private static Caretaker c = new Caretaker();
41
public static void main(Sting[] args)
{
42
o.setState("ON");
43
c.saveMemento(o.createMemento());
44
o.setState("OFF");
45
o.restoreMemento(c.retrieveMemento());
46
}
47
}
白箱的优点:实现简单


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

白箱的缺点:上边说了,破坏了封装,安全性有些问题。
说明:这里白箱的实现只保存了一个状态,其实是可以保存多个状态的。
3,双接口的实现,宽窄接口(黑箱)
如何实现宽窄接口呢,内部类也许是个好方法。我们把备忘录类设计"成发起人"的内部类,但这样还有的问题是同一
package中的其它类也能访问到,为了解决这个问题,我们可以把"备忘录"的方法设计成私有的方法,这样就
可以保正封装,又保正发起人能访问到。实现如下:
定义窄接口.
1
public interface NarrowMemento
{
2
public void narrowMethod();
3
}
4
class Originator
{
5
private String state;
6
private NarrowMemento memento;
7
public Originator()
{
8
}
9
public NarrowMemento createMemento()
{
10
memento = new Memento(this.state);
11
return memento;
12
}
13
public void restoreMemento(NarrowMemento memento)
{
14
Memento aMemento = (Memento)memento;
15
this.setState(aMemento.getState());
16
}
17
public String getState()
{
18
return this.state;
19
}
20
public void setState(String state)
{
21
this.state = state;
22
}
23
//内部类
24
protected class Memento implements NarrowMemento
{
25
private String savedState;
26
private Memento(String someState)
{
27
saveState = someState;
28
}
29
private void setState(String someState)
{
30
saveState = someState;
31
}
32
private String getState()
{
33
return saveState;
34
}
35
public void narrowMethod()
{
36
System.out.println("this is narrow method");
37
}
38
39
}
40
public NarrowMemento getNarrowMemento()
{
41
return memento;
42
}
43
}
44
public class Caretaker
{
45
private NarrowMemento memento;
46
public NarrowMemento retrieveMemento()
{
47
return this.memento;
48
}
49
public void saveMemento(NarrowMemento memento)
{
50
this.memento = memento;
51
}
52
}
53
public class Client
{
54
private static Originator o = new Originator();
55
private static Caretaker c = new Caretaker();
56
public static void main(String[] args)
{
57
//use wide interface
58
o.setState("On");
59
c.saveMemento(o.createMemento());
60
o.setState("Off");
61
o.restoreMemento(c.retrieveMemento());
62
//use narrow interface
63
NarrowMemento memento = o.getNarrowMemento();
64
memento.narrowMethod();
65
66
}
67
}
ok,实现了对大多数人实现比较窄的接口,对Originator实现了宽接口.


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

三,最后的一些说明:
1,