【行为型】观察者模式
定义
1
2
3
4
定义:定义一种一对多的依赖关系,让多个观察者对象同时监听某一对象。这个主题对象在状态发生变化时,会通知所有观察
者对象,使它们能做出相应的动作。
模板方法模式角色:
UML图
1
2
3
4
5
6
7
8
9
10
11
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
| | | |
| AbstractSubject |---→| AbstractObserver |
|_ _ _ _ _ _ _ _ _ _| |_ _ _ _ _ _ _ _ _|
↑ ↑
| |
| |
_ _ _ _ |_ _ _ _ _ _ _ _ _ _|_ _ _ _ _
| | | |
| ConcreteSubject |←---| ConcreteObserver |
|_ _ _ _ _ _ _ _ _ _| |_ _ _ _ _ _ _ _ _ _|
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public abstract class Leader{
private ArrayList<Observer> observerList = new ArrayList<Observer>();
public void addObserver(Observer observer){
observerList.add(observer);
}
public void delObserver(Observer observer){
observerList.remove(observer);
}
public void notify(){
for(Observer observer : observerList){
observer.do();
}
}
}
1
2
3
4
public abstract class Observer{
public abstract void do();
}
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
public class Teacher extends Leader{
private String message;
public void setMessage(String message){
this.message = message;
}
public String getMessage(){
return this.message;
}
} ***
public class Monitor extends Observer{
private String name;
private String observerMessage;
private Teacher teacher;
public Monitor(Teacher teacher, String name){
this.name = name;
this.teacher = teacher;
}
public void do(){
this.observerMessage = teacher.getMessage();
System.out.println("The monitor of "+this.name+" get message from teacher:"+this.observerMessage);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Client{
public static void main(String[] args){
Teacher teacher = new teacher();
teacher.addObserver( new Monitor(teacher,"Jack") );
teacher.addObserver( new Monitor(teacher,"Bill") );
teacher.setMessage("I will have a rest for a few days.");
teacher.notify();
}
}
运行结果:
The monitor of Jack get message from teacher: I will have a rest for a few days.
The monitor of Bill get message from teacher: I will have a rest form a few days.