观察者模式定义:
如果想实现观察者模式,则必须依靠java.util包中提供的Obeservable类和Observer接口。
Observer接口:此接口有一个update方法,当观察的事物发生变化就调用此方法。
Obeservable类:
------》addObserver方法:增加一个观察者
------》deleteObserver方法:删除一个观察者
------》setChanged方法:标记观察者状态
------》nitifyObservers方法:通知观察者发生变化。
package 观察者设计模式;
import java.util.Observable;
import java.util.Observer;
public class Demo1 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
House h = new House(1000000);
HousePriceObserver hpo1 = new HousePriceObserver("购房者A");
HousePriceObserver hpo2 = new HousePriceObserver("购房者B");
HousePriceObserver hpo3 = new HousePriceObserver("购房者C");
h.addObserver(hpo3);
h.addObserver(hpo2);
h.addObserver(hpo1);
System.out.println(h);//输出房子价钱
h.setPrice(222222);
}
}
class House extends Observable {
private float price;
public House(float price) {
this.price = price;
}
public float getPrice() {
return this.price;
}
public void setPrice(float price) {
//每次设置价格的时候,也就是价格变化的时候要通知观察者
this.price = price;
System.out.println("当前的价格变为: " + this.price);
setChanged();
notifyObservers();
}
public String toString(){
return "房子价钱为:" + this.price;
}
}
class HousePriceObserver implements Observer{
private String name;
public HousePriceObserver(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void update(Observable o, Object arg) {
House h = (House) o ;
System.out.print(this.name + "观察到价格更改为:");
System.out.println(h.getPrice());
}
}
总结:
在Observer接口中的update方法里面的两个参数:
o:具体表示发出通知的Observable类的对象。即表示哪个被观察者发出了通知。
arg:需要被观察的内容。
被观察者即可被观察的对象 就是继承于Observable的类。其中发送通知时一定调用super.setChanged()方法和notifyObservers(XXX)方法。
此设计模式是Java本身的机制,不使用Observer接口和Observable类也是可以实现的,但是比较复杂。