標籤:
觀察者模式在Java中有兩種實現方式,上文是一種方式,這種方式是自己寫代碼實現。另一種方式是使用Java內建的觀察者模式來實現。 相關的介面和類如下:java.util.Observable 主題(可觀察者)------class
java.util.Observer 觀察者 -------interface 相關的API如下:
1、java.util.ObservableObservable()
構造一個帶有零個觀察者的 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。
2、java.util.Observer
void update(Observable o, Object arg)
只要改變了 observable 對象就調用此方法。 觀察API可以發現,
java.util.Observable已經對觀察者進行管理了,不再需要主題追蹤每個觀察者了。 下面通過Java的內建的觀察者模式來重寫上個天氣應用,部分類代碼如下:import java.util.Observable;
public class WeatherData extends Observable {
private float temperature;
private float humidity;
private float pressure;
public WeatherData() {
}
/**
* 測量值改變了
*/
public void measurementsChanged() {
setChanged(); //設定改變了
notifyObservers(); //通知所有的觀察者
}
/**
* 重新設定了測量值
*/
public void setMeasurements(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
measurementsChanged();
}
public float getTemperature() {
return temperature;
}
public float getHumidity() {
return humidity;
}
public float getPressure() {
return pressure;
}
} public interface DisplayElement {
public void display();
} import java.util.Observable;
import java.util.Observer;
public class CurrentConditionsDisplay implements Observer, DisplayElement {
Observable observable;
private float temperature;
private float humidity;
public CurrentConditionsDisplay(Observable observable) {
this.observable = observable;
observable.addObserver(this);
}
public void update(Observable obs, Object arg) {
if (obs instanceof WeatherData) {
WeatherData weatherData = (WeatherData) obs;
this.temperature = weatherData.getTemperature();
this.humidity = weatherData.getHumidity();
display();
}
}
public void display() {
System.out.println("Current conditions: " + temperature
+ "F degrees and " + humidity + "% humidity");
}
} 看上面的代碼,
java.util.Observable不是介面,是類,如果一個類想具有另一個超類的功能,同時還想擁有
Observable行為,就陷入兩難地步。 實際上,Java內部使用觀察者模式也很多,GUI的事件就是典型的觀察者模式。
本文出自 “熔 岩” 部落格,請務必保留此出處http://lavasoft.blog.51cto.com/62575/201633
設計模式-觀察者模式(下)<轉>