实现观察者模式涉及到一个类和一个接口--Observable类和Observer接口;
被观察的类需要继承Observable类,在该类中的常用方法有:
public void addObserver(Observer o);增加一个观察者观察自己;
public void deleteObserver(Observer o);删除一个已有的观察者;
public void notifyObservers(Object arg);唤醒所有观察者,通知他们已经发生了更新,这时候会调用观察者的update()方法,并传入参数 arg;
protected void setChanged();设置状态改变的具体内容;
观察者类需要实现Observer接口,该接口中有一个方法:
void update(Observable o,Object arg);当被观察对象调用notifyObservers()方法时,自动调用该方法通知观察者;
例子:一个市场,多个观察者;
class Market extends Observable{
private String name = "";
private int value = 0;
public Market(String name,int value){
this.name = name;
this.value = value;
}
public void change(String name,int nvalue){
this.name = name;
this.value = nvalue;
super.setChanged();//调用父级函数,改变被观察对象的状态点
super.notifyObservers(nvalue);//通知观察者,被观察对象发生改变;
//其中可传入单个参数,也可不传,在接收出直接用对象处理
}
public String toString(){
return "The name is "+name+" and value is "+value;
}
}
class Investor implements Observer{
private String name="";
public Investor(String name){
this.name = name;
}
//更新观察者对象,接收被观察对象,可处理其一切状态
public void update(Observable o,Object arg){
if(o instanceof Market){
System.out.println("observer "+name+": "+o);
}
}
}
其中,为了使得被观察的改变被观察者察觉,setChanged()与notifyObservers()这两个函数缺一不可;
定义完后,可以直接使用:
public static void main(String args[]){
Market ma = new Market("A",55);
Investor in1 = new Investor("wang");
Investor in2 = new Investor("zhang");
Investor in3 = new Investor("li");
ma.addObserver(in1);
ma.addObserver(in2);
ma.addObserver(in3);
System.out.println(ma);
ma.change("B",65);
}
结果如图: