Java觀察者模式
Java觀察者模式定義對象間一對多的依賴關(guān)系,當(dāng)一個對象(被觀察者)的狀態(tài)發(fā)生改變時,所有依賴于它的對象(觀察者)都得到通知并自動更新。JDK中提供的觀察者模式的實現(xiàn)是由接口和java.util.Ob
Java觀察者模式定義對象間一對多的依賴關(guān)系,當(dāng)一個對象(被觀察者)的狀態(tài)發(fā)生改變時,所有依賴于它的對象(觀察者)都得到通知并自動更新。JDK中提供的觀察者模式的實現(xiàn)是由接口和java.util.Observable類組成的,其中Observer代表觀察者,而Observable代表被觀察者。
Observable類
Observable類是由被觀察者(可有一個或多個觀察者)所繼承。調(diào)用setChanged方法,使得hasChanged方法返回值為true,則再次調(diào)用notifyObservers方法會觸發(fā)觀察者的update方法來通知觀察者該實例發(fā)生變化。
Observer接口
Observer接口中只有一個未實現(xiàn)的update抽象方法,實現(xiàn)該接口的對象稱為觀察者,該對象要實現(xiàn)update方法。注冊了該對象(觀察者)的對象(被觀察者)實例在調(diào)用notifyObservers方法之后,會自動調(diào)用觀察者中的update方法。
被觀察者
被觀察者代表熱水器,繼承Observable類。它具有g(shù)etTemperature和setTemperature方法來獲取和設(shè)置水溫。boilWater方法用于燒水,當(dāng)水溫達到100度時,調(diào)用setChanged方法將hasChanged方法返回值設(shè)為true,并調(diào)用notifyObservers方法通知觀察者。
觀察者
觀察者I114gBoxDisplayObservable代表顯示器,繼承Observable類并實現(xiàn)Observer接口。它具有g(shù)etStatus和setStatus方法用于獲取和設(shè)置水的狀態(tài)。displayTemperature方法用于顯示當(dāng)前水溫,當(dāng)水溫達到100度時會將狀態(tài)設(shè)為熱水,并調(diào)用setChanged方法將hasChanged方法返回值設(shè)為true,并調(diào)用notifyObservers方法通知觀察者。
觀察者
觀察者I114gBoxAlarmObserver代表報警器,實現(xiàn)Observer接口。它具有update方法用于在被觀察者狀態(tài)發(fā)生變化時觸發(fā)報警操作。
測試類
測試類用于運行觀察者模式的示例。在main方法中創(chuàng)建了一個熱水器對象、一個顯示器對象和一個報警器對象。然后通過調(diào)用addObserver方法將顯示器設(shè)置為熱水器的觀察者,將報警器設(shè)置為顯示器的觀察者。最后調(diào)用熱水器的boilWater方法來模擬燒水過程。
運行測試類,結(jié)果如下: