备忘录模式

Posted by 石玉军 on 2018-07-26

备忘录模式:在不破坏封装的条件下,将一个对象的状态捕捉住,并在外部化存储起来,从而可以在将来合适的时候把这个对象还原到存储时的状态。

通常的备忘录模式包含3个角色:

发起人角色:这个角色就是需要被保存状态的角色
备忘录角色:负责保存发起人角色的状态的对象
负责人角色:负责保存备忘录对象,且它不能看到备忘录的内容

我们通过一个简单的例子来描述一下这几个角色:

我们知道现在有很多小姐姐喜欢自拍,而已有的是很火辣的那种不能为外人道哉的。这些小姐姐通常把这类照片存在手机的私密相册中。

看一下这句话,能不能看出来备忘录3个角色分别对应的什么呢?

我知道厉害的你已经懂了,就算不懂也没关系,我们接着往下看:

1

Client:客户端,负责调用发起人和负责人
Girl:这个就是发起人了,她拍个每一个照片可以都看做是一种状态
Phone:负责人,顾明思议,这个是手机,它负责存储照片
Album:相册接口

看了类图你可能会感觉迷糊了,哎你不是说负责人不能看到备忘录的东西么,你这里面负责人可以直接持有了备忘录对象呀,它看不到啥呀,你这样搞小姐姐们的照片不就被公开了么?其实接着再往下看代码你就明白了

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
public interface Album {

}

public class Girl {
private String state;

public Album getPrivateAlbum(){
return new PrivateAlbum(this.state);
}
public void restore(Album album){
PrivateAlbum privateAlbum =(PrivateAlbum)album;
this.setState(privateAlbum.getState());
}

public String getState() {
return state;
}

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

private class PrivateAlbum implements Album{
private String state;

private PrivateAlbum(String state){
this.state=state;
}

private String getState() {
return state;
}

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

public class Phone {

private Album album;

public Album reductionAlbum() {
return album;
}

public void saveAlbum(Album album) {
this.album = album;
}
}

public class Client {
private static Girl xiaoWang=new Girl();
private static Phone phone =new Phone();

public static void main(String args[]){
xiaoWang.setState("三点式");
phone.saveAlbum(xiaoWang.getPrivateAlbum());
System.out.println(xiaoWang.getState());
xiaoWang.setState("丝袜制服式");
System.out.println(xiaoWang.getState());
xiaoWang.restore(phone.reductionAlbum());
System.out.println(xiaoWang.getState());
}
}

告诉我你看到了什么?相册接口仅仅作为标示接口存在的,它的实现是Girl里面的一个私有内部类PrivateAlbum 类,这个类啊,是一个加密相册,在其余任何地方都是看不到的,只有小姐姐自己可以看见,妥妥的安全。

现在,你get到备忘录模式了么?