【Java】觀察者模式
阿新 • • 發佈:2019-02-20
本文是《【C++】觀察者模式》(點選開啟連結)的Java實現,關於什麼是觀察者模式這裡就不將了,只是從類圖為視覺重新審視這條2014年上半年的軟體設計師的軟考題。
題目是這樣的:
某實驗室欲建立一個實驗室的環境監測系統,能夠顯示實驗室的溫度、溼度以及潔淨度等環境資料,當獲取到最新的環境測量資料時,顯示的環境資料能夠更新,現在採用觀察者(Observer)模式來開發該系統,觀察者模式的類圖如圖5-1所示:
程式碼還是在做一件通過修改具體主題類的類成員,達到自動更新具體觀察類的類成員事情。
從類圖可以看到ConcreteSubject與ConcreteObserver是分別實現Subject與Observer兩個介面的,因為其繼承線段是虛線。
同時觀察者與主題之間是關聯關係,也就是說在觀察者類中必有主題這個類成員,主題類中必有觀察者這個類成員。
而且觀察者是是通過register與interest來操作主題,主題則通過update來操作觀察者。
具體實現程式碼如下:
import java.util.*; //介面 interface Observer{ public void update(float temp,float humidity,float cleanness); } interface Subject{ public void registerObserver(Observer o);//註冊對主題感興趣的觀察者 public void removeObserver(Observer o);//刪除觀察者 public void notifyObservers();//當主題發生變化時通知觀察者 } //具體主題 class EnvironmentData implements Subject{ private ArrayList<Observer> observers; private float temperature,humidity,cleanness; public EnvironmentData(){ observers=new ArrayList<Observer>(); } @Override public void registerObserver(Observer o) { observers.add(o); } @Override public void removeObserver(Observer o) { observers.remove(o); } @Override public void notifyObservers() { for (int i = 0; i < observers.size(); i++) { Observer observer=(Observer)observers.get(i); observer.update(temperature, humidity, cleanness);//用於改變佇列中所有Observer的類成員 } } //改變主題屬性的同時,將佇列中所有觀測者的類成員改變 public void setMeasurements(float temperature,float humidity,float cleanness){ this.temperature=temperature; this.humidity=humidity; this.cleanness=cleanness; notifyObservers(); } } //具體觀察者 class CurrentConditionsDisplay implements Observer{ private String NAME="觀察者1"; private float temperature; private float humidity; private float cleanness; private Subject envData; public CurrentConditionsDisplay(Subject envData,String NAME) {//構造方法 this.envData=envData; this.envData.registerObserver(this);//在主題的觀察者佇列中註冊自己 this.NAME=NAME; } public void update(float temperature,float humidity,float cleanness){ this.temperature=temperature; this.humidity=humidity; this.cleanness=cleanness; } public void display() { System.out.println("我是"+NAME+",現在的溫度是:"+temperature+",顯示的溼度是:"+humidity+",現在的潔淨度是:"+cleanness); } } //主函式 public class EnvironmentMonitor { public static void main(String[] args) { EnvironmentData envData=new EnvironmentData(); CurrentConditionsDisplay currentDisplay1=new CurrentConditionsDisplay(envData,"觀察者1"); CurrentConditionsDisplay currentDisplay2=new CurrentConditionsDisplay(envData,"觀察者2"); envData.setMeasurements(80, 65, 30.4f); currentDisplay1.display(); currentDisplay2.display(); } }
執行結果如下: