观察者设计模式主要的使用场景在于一个对象变化之后,依赖该对象的对象会收到通知,就像RSS的订阅,当订阅了博客的RSS以后,订阅者就回收到新的订阅信息。
Jdk内置提供了Observable和Observer,用来实现观察者模式。
1》 定义一个Observable
public class MetricsObserable extendsObservable {
private Map<String, Long> counterMap = new HashMap<>();
public void updateCounter(String key, Long value) {
counterMap.put(key, value);
setChanged();//标记此 Observable 对象为已改变的对象;现在 hasChanged 方法将返回 true。
notifyObservers(counterMap);//如果 hasChanged
方法指示对象已改变,则通知其所有观察者,并调用 clearChanged
方法来指示此对象不再改变。
}
}
2》 写Observer
// Observer
public class AdminA implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("adminA:" + arg);
}
}
public class AdminB implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("adminB:" + arg);
}
}
测试:
MetricsObserable metricsObserable = newMetricsObserable();
metricsObserable.addObserver(new AdminA());//如果观察者与集合中已有的观察者不同,则向对象的观察者集中添加此观察者。
metricsObserable.addObserver(new AdminB());//如果观察者与集合中已有的观察者不同,则向对象的观察者集中添加此观察者。
metricsObserable.updateCounter("request-count",100l);
打印出:
adminB: {request-count=100}
adminA: {request-count=100}