描述
观察者模式又叫发布订阅模式,拥有一个监听者,如果一个被监听者发生了改变则会通知到所有监听者。例子,警察和嫌疑犯之间就是观察者模式。微信朋友圈,相对于好友,你就是观察者,微信好友发送朋友圈你会收到通知
类图
代码实现
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(); } }
|
总结
可以看到在被观察者类上面存放观察者的集合,在调用观察者的相关方法的时候循环调用观察者,从而实现发布订阅模式。
被观察者需要提供添加观察者和通知观察者方法
- 观察者和被观察者的实现复合开闭原则
- 实现通知模式
- 如果观察者过多通知的时间成本加大
- 观察者只知道目标变化,但是具体变化情况不得而知。可以定义相关事件来区分