觀察者模式
1. 定義
定義了對象之間一對多的關係,這樣一樣,當一個對象改變狀態時,它的所有依賴者都會收到通知並且自動更新。
2. 建造一個氣象臺
氣象臺實現接口
- 主題 Subject 作爲 被觀察者 接口,實現 註冊觀察者 registerObserver(), 除去觀察者 removeObserver(),通知所有觀察者
- Observer 作爲 觀察者接口,實現 update(float temp , float humidity, float pressure) 方法
- DisplayElement 作爲 觀察者顯示的接口,實現 display()方法
- 被觀察者 接口
public interface Subject {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObserver();
}
- 觀察者接口
public interface Observer {
public void update(float temp , float humidity , float pressure );
}
public interface DisplayElement {
public void display();
}
氣象臺實現類
被觀察者 WeatherData
public class WeatherData implements Subject{
private float temp;
private float humidity;
private float pressure;
//構造函數時候創建
private ArrayList<Observer> observers;
// 所有觀察者
public WeatherData(){
observers = new ArrayList<Observer>();
}
//註冊觀察者
public void registerObserver(Observer o) {
observers.add(o);
}
//刪除觀察者
public void removeObserver(Observer o) {
int i = observers.indexOf(o);
if(i >= 0){
observers.remove(i);
}
}
//通知觀察者
public void notifyObserver() {
for(int i = 0 ; i < observers.size() ; i++){
Observer o = (Observer) observers.get(i);
o.update(temp,humidity,pressure);
}
}
public void setMeasurement(float temp , float humidity , float pressure){
this.temp = temp;
this.humidity = humidity;
this.pressure = pressure;
measurementChanged();
}
public void measurementChanged(){
notifyObserver();
}
public float getTemp() {
return temp;
}
public void setTemp(float temp) {
this.temp = temp;
}
public float getHumidity() {
return humidity;
}
public void setHumidity(float humidity) {
this.humidity = humidity;
}
public float getPressure() {
return pressure;
}
public void setPressure(float pressure) {
this.pressure = pressure;
}
}
事實情況 觀察者 CurrentCondition
public class CurrentCondition implements Observer , DisplayElement {
private float temp;
private float humidity;
private Subject weatherDate;
public CurrentCondition(Subject weatherData){
this.weatherDate = weatherData;
weatherData.registerObserver(this);
}
public void update(float temp, float humidity, float pressure) {
this.temp = temp;
this.humidity = humidity;
display();
}
public void display(){
System.out.println("CurrentCondition : " + "temperature = " + temp +"℃ and " + "humidity = " + humidity + "%");
}
}
最大最小溫度情況 觀察者 MaxMinCondition
public class MaxMinCondition implements Observer , DisplayElement{
float maxTemp ;
float minTemp ;
Subject weatherData;
public MaxMinCondition(Subject weatherData){
this.weatherData = weatherData;
maxTemp = 0;
minTemp = 0;
weatherData.registerObserver(this);
}
public void update(float temp, float humidity, float pressure) {
if (maxTemp == 0 && minTemp == 0){
maxTemp = temp;
minTemp = temp;
}
else if(temp > maxTemp){
maxTemp = temp;
}else if (temp < minTemp){
minTemp = temp;
}
display();
}
public void display(){
System.out.println("MaxTemplate is " + maxTemp + "and MinTemplate is " + minTemp);
}
}