觀察者模式(釋出/訂閱模式)
阿新 • • 發佈:2018-12-10
觀察者模式提供了避免元件之間緊密耦合的另一種方法,它將觀察者和被觀察者的物件分離開。在該模式中,一個物件通過新增一個方法(該方法允許另一個物件,即觀察者註冊自己)使本身變得可觀察。當可觀察的物件更改時,它會將訊息傳送到已註冊的觀察者。這些觀察者收到訊息後所執行的操作與可觀察的物件無關,這種模式使得物件可以相互對話,而不必瞭解原因。java語言與C#語言的時間處理機制就是採用此種設計模式。
例如,使用者介面(同一個資料可以有多種不同的顯示方式)可以作為觀察者,業務資料是被觀察者,當資料有變化後會通知介面,介面收到通知後,會根據自己的顯示方式修改介面的顯示方式。面向物件設計的一個原則是:系統中的每個類將重點放在某一個功能上,而不是其他方面。一個物件只做一件事情,並且將它做好。觀察者模式在模組之間劃定了清晰的界限,提高了應用程式的可維護性和重用性。設計類圖如圖所示。
下面給出一個觀察者模式的示例程式碼,程式碼的主要功能是實現天氣預報,同樣的溫度資訊可以有多種不同的展示方式。
public interface Observer { //更新溫度 public void update(float temp); } public interface Subject { public void registerObserver(Observer o); public void removeObserver(Observer o); public void notifyObservers(); } import java.util.ArrayList; public class Whether implements Subject { private ArrayList<Observer>observers = new ArrayList<Observer>(); private float temperature; @Override public void registerObserver(Observer o) { this.observers.add(o); } @Override public void removeObserver(Observer o) { this.observers.remove(o); } @Override public void notifyObservers() { for(int i=0;i<this.observers.size();i++){ this.observers.get(i).update(temperature); } } public void whetherChange(){ this.notifyObservers(); } public float getTemperature(){ return temperature; } public void setTemperature(float temperature){ this.temperature =temperature; notifyObservers(); } } public class WhetherDisplay1 implements Observer { private float temperature; public WhetherDisplay1(Subject whether){ whether.registerObserver(this); } @Override public void update(float temp) { this.temperature=temp; display(); } public void display(){ System.out.println("display1****:"+this.temperature); } } public class WhetherDisplay2 implements Observer{ private float temperature; public WhetherDisplay2(Subject whether){ whether.registerObserver(this); } @Override public void update(float temp) { this.temperature=temp; display(); } public void display(){ System.out.println("display2----:"+this.temperature); } } public class Test { public static void main(String[] args) { Whether whether = new Whether(); WhetherDisplay1 d1 = new WhetherDisplay1(whether); WhetherDisplay2 d2 = new WhetherDisplay2(whether); whether.setTemperature(27); whether.setTemperature(26); } }