Observe 觀察者模式
簡述:
- 觀察者模式類似于訂牛奶業務:① 奶站:Subject;② 使用者:Observer。
- Subject:登記注冊、移除和通知:①registerObserver 注冊;② removeObserver 移除; ③ notifyObservers 通知所有的注冊使用者,根據不同需求,可以是更新資料,讓使用者來取,也可以是實施推送,看具體需求定。
- Observer:接受輸入
- 觀察者模式:對象之間多對一依賴的一種設計方案,被依賴的對象為Subject,依賴的對象為Observer,Subject通知Observer變化,比如這裡的奶站是Subject,是一的一方,使用者是Observer,是多的一方。
例子
天氣預報:一個接口Subject,有registerObserver方法(傳入Observer參數),還有一個remove方法(Observer參數),還有一個notifyObservers方法。有一個WeatherData類實作了Subject,有一個集合ArrayList< Observer >。有一個Observer接口,其中有個update方法,有CurrentCondition實作它。
Subject接口:
public interface Subject {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObserver();
}
Observer接口:
public interface Observer {
public void update(float temperature,float pressure,float humidity);
}
CurrentCondition類:
public class CurrentCondition implements Observer{
private float temperature;
private float pressure;
private float humidity;
@Override
public void update(float temperature, float pressure, float humidity) {
this.temperature=temperature;
this.pressure=pressure;
this.humidity=humidity;
display();
}
public void display(){
System.out.println("****Today temperature ="+temperature+"****");
System.out.println("****Today pressure ="+pressure+"****");
System.out.println("****Today humidity ="+humidity+"****");
}
}
WeatherData類:
public class WeatherData implements Subject{
private float temperature;
private float pressure;
private float humidity;
private ArrayList<Observer> observers;
public void dataChange(){
notifyObserver();
}
public void setData(float temperature,float pressure,float humidity){
this.temperature=temperature;
this.pressure=pressure;
this.humidity=humidity;
dataChange();
}
public WeatherData() {
observers=new ArrayList<>();
}
public float getTemperature() {
return temperature;
}
public float getPressure() {
return pressure;
}
public float getHumidity() {
return humidity;
}
@Override
public void registerObserver(Observer o) {
observers.add(o);
}
@Override
public void removeObserver(Observer o) {
if (observers.contains(o)) observers.remove(o);
}
@Override
public void notifyObserver() {
for (int i=0;i<observers.size();i++){
observers.get(i).update(temperature,pressure,humidity);
}
}
}
Client主方法:
public class Client {
public static void main(String[] args) {
WeatherData weatherData=new WeatherData();
CurrentCondition currentCondition=new CurrentCondition();
weatherData.registerObserver(currentCondition);
weatherData.setData(10,100,40);
}
}
觀察者模式的好處
- 觀察者模式設計後,會議集合的方式來管理使用者(Observer),包括注冊,移除和通知。
- 這樣,我們增加觀察者(這裡可以了解成一個新的公告闆),就不需要去修改核心類WeatherData,遵守了OCP原則。