观察者模式

Posted by Jfson on 2018-05-02

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。

一个很经典的例子,上传文件,成功的时候,需要通知给多个位置发送上传成功消息示例。

1.JAVA 中已经有了对观察者模式的支持类。 2、避免循环引用。 3、如果顺序执行,某一观察者错误会导致系统卡壳,一般采用异步方式。

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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
public class Observer {
static class UploadFile {
static ArrayList<UploadListener> mListeners = new ArrayList<>();
public static void setListener(UploadListener listener) {
if (mListeners != null) mListeners.add(listener);
}
public static void removeListener(UploadListener listener) {
if (mListeners != null && mListeners.contains(listener)) mListeners.remove(listener);
}
public static void upload() {
// ...
notifySuccess();
notifyFail();
}
private static void notifySuccess() {
if (mListeners == null) return;
for (UploadListener listener : mListeners) {
if (listener != null) listener.success();
}
}
private static void notifyFail() {
if (mListeners == null) return;
for (UploadListener listener : mListeners) {
if (listener != null) listener.fail();
}
}
}
interface UploadListener {
void success();
void fail();
}
void test() {
UploadFile.setListener(new UploadListener() {
@Override
public void success() {
// Observer 1
}
@Override
public void fail() {
}
});
UploadFile.setListener(new UploadListener() {
@Override
public void success() {
// Observer 2
}
@Override
public void fail() {
}
});
UploadFile.setListener(new UploadListener() {
@Override
public void success() {
// Observer 3
}
@Override
public void fail() {
}
});
UploadFile.setListener(new UploadListener() {
@Override
public void success() {
// Observer 4
}
@Override
public void fail() {
}
});
UploadFile.upload();
}
}

pv UV: