Demo場景:終端通過WeatherData實時顯示(獲取)變化的數據。
(1)主題接口:Subject
package designpattern.observer.v1;
/**
* 主題接口
*/
public interface Subject {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObservers();
}
(2)主題接口實現類:WeatherData
package designpattern.observer.v1;
import java.util.ArrayList;
public class WeatherData implements Subject {
private ArrayList<Observer> observers;
private float temprature;
private float humidity;
private float pressure;
public WeatherData(){
observers = new ArrayList<Observer>();
}
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
int i = observers.indexOf(observer);
if(i>0){
observers.remove(observer);
}
}
@Override
public void notifyObservers() {
for(int i=0; i<observers.size(); i++){
Observer observer = observers.get(i);
observer.update(temprature, humidity, pressure);
}
}
//檢測到變化時,通知觀察者
public void measurementsChanged(){
notifyObservers();
}
public void setMeasurements(float temprature, float humidity, float pressure){
this.temprature = temprature;
this.humidity = humidity;
this.pressure = pressure;
measurementsChanged();
}
}
(3)觀察者接口:Observer
package designpattern.observer.v1;
/**
* 定義觀察者接口
*/
public interface Observer {
public void update(float temp, float humidity, float pressure);
}
(4)觀察者play行爲接口:DisplayElement
package designpattern.observer.v1;
/**
* 定義顯示這個行爲的接口
*/
public interface DisplayElement {
public void display();
}
(5)觀察者接口、行爲接口實現類:CurrentConditionsDisplay
package designpattern.observer.v1;
public class CurrentConditionsDisplay implements Observer, DisplayElement {
private float temprature;
private float humidity;
private Subject weatherData;
public CurrentConditionsDisplay(Subject weatherData){
this.weatherData = weatherData;
weatherData.registerObserver(this);
}
@Override
public void display() {
System.out.println("Current Conditions:" + temprature + "C degrees and " + humidity + "% humidity");
}
@Override
public void update(float temp, float humidity, float pressure) {
this.temprature = temp;
this.humidity = humidity;
display();
}
}
演示觀察者模式
package designpattern.observer.v1;
public class WeatherStation {
public static void main(String[] args) {
//實例化一個主題
WeatherData weatherData = new WeatherData();
CurrentConditionsDisplay currentCondDisplay = new CurrentConditionsDisplay(weatherData);
weatherData.setMeasurements(10, 20, 30.4f);
weatherData.setMeasurements(11, 19, 35.6f);
weatherData.setMeasurements(15, 30, 40.4f);
}
}