描述

观察者模式又叫发布订阅模式,拥有一个监听者,如果一个被监听者发生了改变则会通知到所有监听者。例子,警察和嫌疑犯之间就是观察者模式。微信朋友圈,相对于好友,你就是观察者,微信好友发送朋友圈你会收到通知

类图

image.png

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
public class PoliceMan {
private String name;

public PoliceMan(String name) {
this.name = name;
}

public void name() {
System.out.println("我是:" + name + "收到消息");
}

}
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 XianFan1 {
private String name;

public XianFan1(String name) {
this.name = name;
}

private List<PoliceMan> policeManList = new ArrayList<>();

public void addPolice(PoliceMan policeMan) {
if (!policeManList.contains(policeMan)) {
policeManList.add(policeMan);
}
}

public void run() {
System.out.println(name + "跑了");
notifyAllPoliceMan();
}
public void notifyAllPoliceMan(){
policeManList.stream().forEach(i -> i.name());
}

}

测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Main {
public static void main(String[] args) {
PoliceMan policeManA =new PoliceMan("警察:A");
PoliceMan policeManB =new PoliceMan("警察:B");
PoliceMan policeManC =new PoliceMan("警察:C");
XianFan1 xianFan1 =new XianFan1("嫌犯1");
xianFan1.addPolice(policeManA);
xianFan1.addPolice(policeManB);
xianFan1.addPolice(policeManC);
xianFan1.run();
}
}

image.png

总结

可以看到在被观察者类上面存放观察者的集合,在调用观察者的相关方法的时候循环调用观察者,从而实现发布订阅模式。
被观察者需要提供添加观察者和通知观察者方法

  • 观察者和被观察者的实现复合开闭原则
  • 实现通知模式
  • 如果观察者过多通知的时间成本加大
  • 观察者只知道目标变化,但是具体变化情况不得而知。可以定义相关事件来区分