JAVA 观察者模式
2018-01-07 21:12
204 查看
观察者模式(Observer/Observable)又常常被称为发布-订阅 (Publish/Subscribe) 模式、源-监听器(Source/Listener) 模式,它旨在实现这样一个目标,当 Observable 发生某种变化时,将这种变化通知给一个或多个 Observable ,使得 Observable 可以监测到其变化,并进行相应的操作。例如在 Web 项目中,我们常常使用 Listener 来监听某件事件的发生(如 HttpSessionListener 可监听 session 的创建与销毁),并进行对应的操作。在 Web 项目中,我们在 web.xml 中注册 Listener,然后由容器负责将事件的发生通知给 Listener 。
观察者模式的完整运行应该包括以下元素和行为。
1) 被观察对象
2) 一个或多个观察者
3) 将观察者与被观察者相关联
4) 被观察对象发生变化
5) 通知所有已注册观察者,并将被观察对象传递给观察者,以便其根据变化内容进行操作。
JDK 自带的类 Observable 和接口 Observer 帮我们实现了上述大部分的需求。Observable 作为被观察对象,其源码如下所示。
Observer 是一个接口,它只有一个 update(Observable o, Object arg) 方法,接受变化了的被观察者和参数,并由实现这个接口的实际观察者负责完善根据被观察者变化需要执行的操作。
借助 JDK 提供的上述类和接口,我们可以非常方便地实现观察者模式。
在很多场景下,观察者模式和生产/消费模式都能满足业务需求。
简单地说,观察者模式是将 Observer 加入到一个集合中,当 Observable 发生变化时遍历集合中的 Observer ,并且执行其 update 方法。这个过程通常是由一个线程中顺序执行的。
生产/消费模式中,生产者并不关心消费者的存在,也不知道消费者在什么时候将进行消费操作;同样,消费者也不用关心生产者的存在于生产时机。二者往往通过一个队列联系起来,即生产者线程(可能有多个)只用将产出放入队列,消费者线程(可能有多个)只管从队列中取出消息进行消费。
观察者模式的完整运行应该包括以下元素和行为。
1) 被观察对象
2) 一个或多个观察者
3) 将观察者与被观察者相关联
4) 被观察对象发生变化
5) 通知所有已注册观察者,并将被观察对象传递给观察者,以便其根据变化内容进行操作。
JDK 自带的类 Observable 和接口 Observer 帮我们实现了上述大部分的需求。Observable 作为被观察对象,其源码如下所示。
public class Observable { // changed 标志被观察对象是否发生了变化 private boolean changed = false; // obs 容器来保存观察者 private Vector<Observer> obs; // 注册观察者 public synchronized void addObserver(Observer o) { if (o == null) throw new NullPointerException(); if (!obs.contains(o)) { obs.addElement(o); } } // 删除观察者 public synchronized void deleteObserver(Observer o) { obs.removeElement(o); } /** * notifyObservers 方法通知所有已注册观察者。 * 调用观察者的 update(Observable o, Object arg) 方法,通过参数将信息传递给观察者,并执行 update 方法里实现的相应操作。 * */ 将被观察对象传递给观察者,同时调用观察者的 update() public void notifyObservers(Object arg){ //... } //... }
Observer 是一个接口,它只有一个 update(Observable o, Object arg) 方法,接受变化了的被观察者和参数,并由实现这个接口的实际观察者负责完善根据被观察者变化需要执行的操作。
借助 JDK 提供的上述类和接口,我们可以非常方便地实现观察者模式。
在很多场景下,观察者模式和生产/消费模式都能满足业务需求。
简单地说,观察者模式是将 Observer 加入到一个集合中,当 Observable 发生变化时遍历集合中的 Observer ,并且执行其 update 方法。这个过程通常是由一个线程中顺序执行的。
生产/消费模式中,生产者并不关心消费者的存在,也不知道消费者在什么时候将进行消费操作;同样,消费者也不用关心生产者的存在于生产时机。二者往往通过一个队列联系起来,即生产者线程(可能有多个)只用将产出放入队列,消费者线程(可能有多个)只管从队列中取出消息进行消费。
相关文章推荐
- Java回调函数与观察者模式实例代码
- java:从消息机制谈到观察者模式
- 观察者模式Observer及Java对此模式的支持
- java设计模式-观察者模式学习
- Java设计模式之观察者模式
- Java面向对象设计模式(十五)——观察者模式(Observer)
- Java 观察者模式
- Java 观察者模式的浅析
- java设计模式---观察者设计模式
- java设计模式之观察者模式
- Java程序性能优化 读书笔记(六)设计模式:观察者模式
- JAVA备忘录之设计模式(02):观察者模式
- Java设计模式----观察者模式(Observer)
- 【知了堂学习笔记】_Java中设计模式之观察者模式的学习
- Java提升-观察者模式(五)
- Java之观察者模式
- 专治Java集合面试回答以及观察者模式解读
- 纵观天下,模式之中,Java世界里的观察者模式
- Java设计模式之观察者
- Java设计模式之观察者模式