观察者模式

观察者模式也叫发布订阅模式。

定义

定义对象间的一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并且被自动更新。

观察者模式通用类图

实现

Subject

定义被观察者必须实现的职责,必须能够动态的增加、取消观察者。
它一般是抽象类或者实现类,仅仅完成作为被观察者必须实现的职责,管理观察者并通知观察者。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public abstract class Subject{
private Vector<Observer> obsVector = new Vector<Observer>();

public void addObserver(Observer o){
this.obsVector.add(o);
}

public void delObserver(Observer o){
this.obsVector.remove(o);
}

public void notifyObservers(){
for(Observer o : this.obsVector){
o.update();
}
}

ConcreteSubject

具体的被观察者,定义被观察者自己的业务,同时定义对哪些事件进行通知。

1
2
3
4
5
6
public class ConcreteSubject extends Subject{
public void doBusiness(){
//...
super.notifyObservers();
}
}

Observer

观察者接收到消息后,对接收到的信息进行处理。

1
2
3
public interface Observer{
public void update();
}

ConcreteObserver

具体的观察者,不同的观察者在处理消息的时候的具体定义。

1
2
3
4
5
public class ConcreteObserver implements Observer{
public void update(){
//do something when invoked.
}
}

Use

1
2
3
4
ConcreteSubject subject = new ConcreteSubject();
Observer obs = new ConcreteObserver();
subject.addObserver(obs);
subject.doBusiness();

应用

优点

  • 观察者和被观察之间是抽象耦合
    如论增加观察者还是被观察者都非常容易扩展
  • 建立了一套规则的触发机制

缺点

效率缺陷,考虑采用异步方式通知。

广播链的问题 A -> B -> C

扩展

Java中的观察者

java 提供了java.util.Observer接口 和 java.util.Observable 类。
被观察者继承java.util.Observable, 观察者实现java.util.Observer.
但是在生产环境中考虑到性能一般不会用这种方式来实现。

生产中的观察者

一般使用MQ来异步处理
本地的如Disruptor