- 定义
观察者模式定义了对象之间的一对多依赖,当一个对象改变时。所以依赖于它的对象都会得到通知。
- 演示样例
interface Observer { void update(int data);}class NewsPaper { private LinkedList observers; public NewsPaper() { observers = new LinkedList<>(); } public void subscribe(Observer o) { observers.add(o); } public void unsubscribe(Observer o) { observers.remove(o); } public void changeData(int data) { for (Observer o : observers) { o.update(data); } }}class Reader implements Observer { private String name; public Reader(NewsPaper paper, String name) { this.name = name; paper.subscribe(this); } @Override public void update(int data) { System.out.println(name + " update data:" + data); }}public class TestObserve { public static void main(String[] args) { NewsPaper newsPaper = new NewsPaper(); Reader tom = new Reader(newsPaper, "tom"); Reader jack = new Reader(newsPaper, "jack"); newsPaper.changeData(10); System.out.println("--"); newsPaper.unsubscribe(tom); newsPaper.changeData(5); }}
全部 Reader 都是观察者,当他订阅了 NewsPaper 后。NewsPaper 一有新数据,就会通知全部订阅了它的 Reader。
- 为什么
为什么要使用观察者模式?由于在初始化被观察者时,并不知道当数据变化时。须要通知谁。
须要通知的对象是动态变化的。
- 谁还用了观察者模式
在 GUI 编程时。我们想要在事件被触发时,运行我们指定的动作。
比如想在button被点击时弹窗体。就能够通过类似AddListener
。将已经实现对应接口的对象加入到button的“订阅列表”中。当button被点击时,系统会依次调用“订阅列表”中对象的对应方法。弹窗体因此被触发。