1.观察者定义:有A,B,C,D四个独立的对象,B,C,D对象希望第一时间知道A对象内部的数据发生变化,以便做出相应的措施。
注:有多个观察者,多个被观察者。
观察者与被观察者也不是对立的,一个对象可以观察其他对象,也可以被其他对象观察。
3.观察者模式在java中的使用:
java提供了两个类来表示观察者(Observer---interface)和被观察者(Observable---class)。
被观察者:首先我们需要继承Observable并设置所需要更新的值:
import java.util.Observable;
public class DataObservable extends Observable{
private String data ;
public void setData(String data){
this .data = data ;
setChanged();
notifyObservers();
}
public String getData() {
return data ;
}
}
观察者们:需要实现Observer并重写update方法,同时需要在构造器中传入被观察者对象以便当观察者实例化时注册到被观察者上。
import java.util.Observable;
import java.util.Observer;
public class CatObserver implements Observer{
public CatObserver(Observable o){
o.addObserver( this);
}
@Override
public void update(Observable o, Object arg) {
DataObservable dataObservable = (DataObservable)o;
String data = dataObservable.getData();
System. out.println("cat" +"===========" +data);
}
}
import java.util.Observable;
import java.util.Observer;
public class DogObserver implements Observer{
public DogObserver (Observable o){
o.addObserver( this );
}
@Override
public void update(Observable o, Object arg) {
DataObservable dataObservable = (DataObservable)o;
String data = dataObservable.getData();
System. out .println("dog" +"===========" +data);
}
}
然后我们来书写测试类:
public static void main(String[] args) throws InterruptedException {
DataObservable data = new DataObservable();
CatObserver cat = new CatObserver(data);
DogObserver dog = new DogObserver(data);
for(int i = 0 ; i < 10 ; i ++){
Thread. sleep(1000);
data.setData( new Date().toString());
}
}
控制台输出结果: