定义:
在单线程中,让一个对象及时得知自身所依赖的状态的变化,用于事件的监听、通知发布等场合,确保观察者在不使用轮询监控的情况下,及时收到相关消息和事件
组成:
角色 | 作用 |
---|---|
主题接口 | 被观察对象,当其状态发生改变或者某事件发生时,会将变化通知观察者,用来维护观察者所需依赖的状态 |
具体主题 | 实现主题接口中的方法,如新增观察者、删除观察者和通知观察者,内部需要维护一个观察者列表 |
观察者接口 | 定义了观察者的基本方法,当依赖状态发生变化时,主题接口就会调用观察者的update方法 |
具体观察者 | 实现了观察者接口的update(),当被观察者状态发生变化时,需要实现的具体业务逻辑 |
代码实现:
我们以JDK内部的一套观察者模式实现来举例 java.util.Observable和java.util.Observer
具体主题(被观察者)Observable
public class JdkObservale extends Observable{
public void add(Observer b){
addObserver(b);
}
public void sendInfo(String msg){
//告诉观察者有变化
setChanged();
//传递给所有观察者一个消息msg
notifyObservers(msg);
}
}
观察者接口:Observer
具体观察者:
观察者1
public class JdkObserver implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("观察者1业务逻辑:" + arg+"观察者总共有"+o.countObservers()+"个");
}
}
观察者2
public class JdkObserver2 implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("观察者2业务逻辑:" + arg+"观察者总共有"+o.countObservers()+"个");
}
}
测试类:
public class TestApp {
public static void main(String[] args){
JdkObservale va=new JdkObservale();
Observer ob1=new JdkObserver();
Observer ob2=new JdkObserver2();
//添加观察者ob1
va.addObserver(ob1);
//添加观察者ob2
va.addObserver(ob2);
//给所有观察者发消息
va.sendInfo("被观察者发生变化");
va.sendInfo("别闹:");
}
}