一、核心思想
又名‘发布--订阅(publish/subscribe)’模式,定义对象间的一种一对多的依赖关系,
让多个观察者对象同时关注同一个对象,当该对象的状态发生变化时,
所有依赖他的对象都得到通知并被自动更新。
关系图:
code
- public interface Observer {
- public void update();
- }
两个实现类:
- public class Observer1 implements Observer {
- @Override
- public void update() {
- System.out.println("observer1 has received!");
- }
- }
- public class Observer2 implements Observer {
- @Override
- public void update() {
- System.out.println("observer2 has received!");
- }
- }
Subject接口及实现类:
- public interface Subject {
- /*增加观察者*/
- public void add(Observer observer);
- /*删除观察者*/
- public void del(Observer observer);
- /*通知所有的观察者*/
- public void notifyObservers();
- /*自身的操作*/
- public void operation();
- }
- public abstract class AbstractSubject implements Subject {
- private Vector<Observer> vector = new Vector<Observer>();
- @Override
- public void add(Observer observer) {
- vector.add(observer);
- }
- @Override
- public void del(Observer observer) {
- vector.remove(observer);
- }
- @Override
- public void notifyObservers() {
- Enumeration<Observer> enumo = vector.elements();
- while(enumo.hasMoreElements()){
- enumo.nextElement().update();
- }
- }
- }
- public class MySubject extends AbstractSubject {
- @Override
- public void operation() {
- System.out.println("update self!");
- notifyObservers();
- }
- }
测试类:
- public class ObserverTest {
- public static void main(String[] args) {
- Subject sub = new MySubject();
- sub.add(new Observer1());
- sub.add(new Observer2());
- sub.operation();
- }
- }
二、何时使用
优点是表示层和数据逻辑层的分离,并定义了稳定的更新消息传递机制,类别清晰,并抽象了更新接口。
使用观察者模式可以实现业务和数据逻辑的通知机制
优点:
被观察者和观察者之间建立了一个抽象的耦合。
观察者模式支持广播通信
缺点:
如果一个被观察者对象有很多直接和间接的观察者的话,将所有观察者都通知到会花费很长时间。
如果有循环依赖,会导致系统崩溃。
没有相应的机制知道所观察的对象是怎么发生变化的。
三、Java中的应用
Observable 和Observer观察者实现。
AWT的事件监听机制