观察者模式
2018-02-05 本文已影响0人
柚子过来
作用:在对象之间定义一对多依赖,当一个对象改变时,其他依赖的对象会接收到通知并自动更新。
OO原则:
封装变化
组合优于继承
针对接口编程优于针对实现编程
松耦合设计
Example:
在Java中有内置的观察者模式,主题对象继承java.util.Observable,观察者实现java.util.Observer。但是可以发现内置的观察者模式有个问题:Observable是类而不是接口。所以使用观察者模式时可以考虑自己实现,毕竟实现起来也比较简单。需要定义的接口及方法与内置的类似。
public class Observable {
public class Observable {
private boolean changed = false;
private Vector<Observer> obs;
public Observable() {
obs = new Vector<>();
}
public synchronized void addObserver(Observer o) { ... ... }
public synchronized void deleteObserver(Observer o) { ... ... }
public void notifyObservers(Object arg) {... ...}
... ...
}
public interface Observer {
void update(Observable o, Object arg);
}
另外,观察者获取消息的方式可以有两种:主题对象主动推送或者观察者自己拉取。像zookeeper的watcher机制和kafka的消息订阅模式都属于观察者模式,前者属于发生change时服务器主动推送通知watcher,后者属于Consumer主动从topic中poll数据。