观察者模式

这一文来看看观察者模式

我们从一个警察和小偷的故事的角度来看.

那么很显然

警察:观察者

功能:能看到被观察的小偷的所有动作

小偷:被观察者

功能:

1.被安装监视器

2.发现监视器,扔掉监视器

3.没有发现监视器,一举一动被监视

好,我们来上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* 观察者
*
* 当被观察者有动作的时候能收到消息
*
* 如警察抓小偷.
*
* 功能:
* 1.看到小偷的动作
*/
public interface Watcher {

void update();

}
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
/**
* 被观察者
*
*
* 如警察抓小偷,被观察者就是小偷
*
* 功能:
* 1.小偷身上可以放置监视器
* 2.若小偷发现身上有监视器,肯定会拿掉
* 3.若小偷没有发现身上有监视器,那么自己的动作会被所有监视的人看到
*/
public interface Watched {

/**
* 放置监视器
* @param watcher 警察
*/
void addWatcher(Watcher watcher);

/**
* 发现监视器,扔掉
* @param watcher
*/
void removeWatcher(Watcher watcher);

/**
* 偷东西的动作被看到
*/
void notifyAllWatcher();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* 实际的警察
*/
public class CWatcher implements Watcher {

private String watcherFirstName;

public CWatcher(String firstName){
this.watcherFirstName = firstName;
}

@Override
public void update() {
System.out.println("我是"+watcherFirstName+"警察,我看到小偷偷东西了");
}
}
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
/**
* 一个实际的被观察者:小偷
*/
public class CWatched implements Watched {

/**
* 用 list 来保存所有观察这个小偷的警察
*/
private List<Watcher> watchers = new ArrayList<>();

//被监视
@Override
public void addWatcher(Watcher watcher) {
watchers.add(watcher);
}

//发现被监视,扔掉监视器
@Override
public void removeWatcher(Watcher watcher) {
watchers.remove(watcher);
}

//没有发现被监视,有动作时被所有监视自己的警察看到
@Override
public void notifyAllWatcher() {
for (Watcher watcher : watchers){
watcher.update();
}
}
}

main

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class TestObserver {

public static void main(String[] args){
Watched watched = new CWatched();

Watcher watcher1 = new CWatcher("张");
Watcher watcher2 = new CWatcher("王");
Watcher watcher3 = new CWatcher("李");

watched.addWatcher(watcher1);
watched.addWatcher(watcher2);
watched.addWatcher(watcher3);

watched.notifyAllWatcher();
}
}

result

1
2
3
4
5
6

我是张警察,我看到小偷偷东西了
我是王警察,我看到小偷偷东西了
我是李警察,我看到小偷偷东西了

Process finished with exit code 0