java中,观察者模式主是由Observer接口和Observable类完成。其中,观察对象继承Observable类,而观察者实现Observer接口。
java.util下的public interface Observer
一个可在观察者要得到 observable 对象更改通知时可实现Observer接口的类。
方法摘要 | |
---|---|
void | update(Observable o, Object arg) 只要改变了 observable 对象就调用此方法。 |
java.util.Observable 类
public class Observable extends Object此类表示模型视图范例中的 observable 对象,或者说“数据”。可将其子类化,表示应用程序想要观察的对象。一个 observable 对象可以有一个或多个观察者。观察者可以是实现了 Observer 接口的任意对象。一个 observable 实例改变后,调用 Observable 的 notifyObservers 方法的应用程序会通过调用观察者的 update 方法来通知观察者该实例发生了改变。
未指定发送通知的顺序。Observable 类中所提供的默认实现将按照其注册的重要性顺序来通知 Observers,但是子类可能改变此顺序,从而使用非固定顺序在单独的线程上发送通知,或者也可能保证其子类遵从其所选择的顺序。
注意,此通知机制与线程无关,并且与 Object 类的 wait 和 notify 机制完全独立。
新创建一个 observable 对象时,其观察者集是空的。当且仅当 equals 方法为两个观察者返回 true 时,才认为它们是相同的。
构造方法摘要 |
---|
Observable() 构造一个带有零个观察者的 Observable。 |
方法摘要 | |
---|---|
void | addObserver(Observer o) 如果观察者与集合中已有的观察者不同,则向对象的观察者集中添加此观察者。 |
protected void | clearChanged() 指示对象不再改变,或者它已对其所有的观察者通知了最近的改变,所以hasChanged方法将返回false。 |
int | countObservers() 返回Observable对象的观察者数目。 |
void | deleteObserver(Observer o) 从对象的观察者集合中删除某个观察者。 |
void | deleteObservers() 清除观察者列表,使此对象不再有任何观察者。 |
boolean | hasChanged() 测试对象是否改变。 |
void | notifyObservers() 如果hasChanged方法指示对象已改变,则通知其所有观察者,并调用clearChanged方法来指示此对象不再改变。 |
void | notifyObservers(Object arg) 如果hasChanged方法指示对象已改变,则通知其所有观察者,并调用clearChanged方法来指示此对象不再改变。 |
protected void | setChanged() 标记此Observable对象为已改变的对象;现在hasChanged方法将返回true。 |
示例代码:
import java.util.Observable;
import java.util.Observer;
class House extends Observable{ //观察对象
private float price;
public House(float price){
this.price=price;
}
public float getPrice(){
return price;
}
public void setPrice(float price){
super.setChanged(); //设置变化点
super.notifyObservers(price); //通知所有观察者价格改变
this.price=price;
}
public String toString(){
return "房子的价格为:"+this.price;
}
}
class HousePriceObserver implements Observer{
private String name;
public HousePriceObserver(String name){
this.name=name;
}
public void update(Observable obj,Object arg){
if(arg instanceof Float){
System.out.print(this.name+"观察到价格更改为:");
System.out.println(((Float)arg).floatValue());
}
}
}
public class Text{
public static void main(String[] args){
House h=new House(100000);
HousePriceObserver hpo1=new HousePriceObserver("购房者A");
HousePriceObserver hpo2=new HousePriceObserver("购房者B");
HousePriceObserver hpo3=new HousePriceObserver("购房者C");
//加入观察者
h.addObserver(hpo1);
h.addObserver(hpo2);
h.addObserver(hpo3);
System.out.println(h);
h.setPrice(66666); //修改房子价格
System.out.println(h);
}
}