观察者模式

观察者模式

理解:
1.被观察者类:内部持有观察者集合,当被观察者触发某个事件,根据具体事件调用所有的被观察者;
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
class Child {
private boolean cry = false;
private List<Observer> observers = new ArrayList<>();

{
observers.add(new Dad());
observers.add(new Mum());
observers.add(new Dog());
observers.add((e)->{
System.out.println("ppp");
});
//hook callback function
}

public boolean isCry() {
return cry;
}

public void wakeUp() {
cry = true;

wakeUpEvent event = new wakeUpEvent(System.currentTimeMillis(), "bed", this);

for(Observer o : observers) {
o.actionOnWakeUp(event);
}
}
}

abstract class Event<T> {
abstract T getSource();
}

class wakeUpEvent extends Event<Child>{
long timestamp;
String loc;
Child source;

public wakeUpEvent(long timestamp, String loc, Child source) {
this.timestamp = timestamp;
this.loc = loc;
this.source = source;
}

@Override
Child getSource() {
return source;
}
}

interface Observer {
void actionOnWakeUp(wakeUpEvent event);
}

class Dad implements Observer {
public void feed() {
System.out.println("dad feeding...");
}

@Override
public void actionOnWakeUp(wakeUpEvent event) {
feed();
}
}

class Mum implements Observer {
public void hug() {
System.out.println("mum hugging...");
}

@Override
public void actionOnWakeUp(wakeUpEvent event) {
hug();
}
}

class Dog implements Observer {
public void wang() {
System.out.println("dog wang...");
}

@Override
public void actionOnWakeUp(wakeUpEvent event) {
wang();
}
}

public class Main {
public static void main(String[] args) {
Child c = new Child();
//do sth
c.wakeUp();
}
}

总结:观察者模式其实大量被应用,例如:回调函数(callback),钩子函数(hook),监听器等