01 定義
觀察者模式:定義了對象之間的一對多依賴,這樣一來,當一個對象改變狀態(tài)時,它的所有依賴者都會收到通知并自動更新。
02 情景
觀察者A和觀察者B都訂閱了天氣預報(被觀察者),當天氣預報發(fā)生變化時,觀察者A和觀察者B都能收到通知。
03 UML

Observer Pattern.png
04 Interface
// 被觀察者
public interface Observable {
void addObserver(Observer o);
void deleteObserver(Observer o);
void notifyObservers();
}
// 觀察者
public interface Observer {
// 更新天氣
void update(int temperature);
}
05 Class
// 天氣預報(被觀察者)
public class WeatherObservable implements Observable {
private ArrayList<Observer> observers;
private int temperature;
public WeatherObservable(){
observers = new ArrayList<>();
}
public void SetTemperature(int temperature){
this.temperature = temperature;
temperatureChanged();
}
private void temperatureChanged(){
notifyObservers();
}
@Override
public void addObserver(Observer o) {
if(o != null && !observers.contains(o)){
observers.add(o);
}
}
@Override
public void deleteObserver(Observer o) {
observers.remove(o);
}
@Override
public void notifyObservers() {
for(Observer observer : observers){
observer.update(temperature);
}
}
}
// 觀察者A
public class ObserverA implements Observer {
public void subscribe(Observable observable){
observable.addObserver(this);
}
public void unSubscribe(Observable observable){
observable.deleteObserver(this);
}
@Override
public void update(int temperature) {
display(temperature);
}
public void display(int temperature){
System.out.println("This is from ObserverA : " + temperature);
}
}
// 觀察者B
public class ObserverB implements Observer {
public void subscribe(Observable observable){
observable.addObserver(this);
}
public void unSubscribe(Observable observable){
observable.deleteObserver(this);
}
@Override
public void update(int temperature) {
display(temperature);
}
public void display(int temperature){
System.out.println("This is from ObserverB : " + temperature);
}
}
06 測試
WeatherObservable weatherObservable = new WeatherObservable();
ObserverA observerA = new ObserverA();
observerA.subscribe(weatherObservable);
ObserverB observerB = new ObserverB();
observerB.subscribe(weatherObservable);
weatherObservable.SetTemperature(10);
// 取消訂閱
observerA.unSubscribe(weatherObservable);
weatherObservable.SetTemperature(20);

TestResult.png