1.概念
observer模式定義對象間的一對多的依賴關係,當一個對象的狀態發生改變時, 所有依賴於它的對象都得到通知並被自動更新。JDK裡提供的observer設計模式的實現由java.util.Observable類和 java.util.Observer介面組成。從名字上可以清楚的看出兩者在Observer 設計模式中分別扮演的角色:Observer是觀察者角色,Observable是被觀察目標(subject)角色。
2.執行個體
該執行個體類比了燒水的過程,涉及三個對象,Heater(熱水器),Display(顯示器),Alarm(通報器).
類比過程:為了便於運行,水的初始化溫度為90,沸點為95,顯示器依據熱水器顯示溫度,顯示器顯示溫度為95時,通報器開始警示。明顯可以看出Heater是subject ,Display 是它的 Obsrver,同時Display亦是suject,因為它要被通報器觀察,所以Alarm是Display的Observer.
實現過程:
a.Heater.java
import java.util.Observable; </p><p>public class Heater extends Observable { </p><p> private int temperature; </p><p> public int getTemperature() {<br /> return temperature;<br /> }<br /> public void setTemperature(int temperature) {<br /> this.temperature = temperature;<br /> }<br /> public void boilWater() {<br /> for (int i = 90; i < 100; i++) {<br /> temperature = i;<br /> this.setChanged();<br /> this.notifyObservers();<br /> }<br /> }<br />}<br />
b.Display.java
import java.util.Observable;<br />import java.util.Observer; </p><p>public class Display extends Observable implements Observer { </p><p> private String status = "未開"; </p><p> public void setStatus(String status) {<br /> this.status = status;<br /> }<br /> public void displayTemputer(int temperature) {<br /> if (temperature > 95) {<br /> this.setStatus("沸騰");<br /> this.setChanged();<br /> this.notifyObservers();<br /> }<br /> System.out.println("狀態:" + status + " 現在溫度:" + temperature + "");<br /> }<br /> public void update(Observable o, Object arg) {<br /> displayTemputer(((Heater) o).getTemperature());//這裡不是很好<br /> }<br />}<br />
c.Alarm.java
import java.util.Observable;<br />import java.util.Observer; </p><p>public class Alarm implements Observer { </p><p> public void makeAlarm() {<br /> System.out.println("嘀嘀嘀...水已經燒開 ");<br /> }<br /> public void update(Observable o, Object arg) {<br /> makeAlarm();<br /> }<br />}<br />
d.測試類別testObserver.java
public class testObserver { </p><p> public static void main(String[] args) {<br /> Heater header = new Heater();<br /> Display display = new Display();<br /> Alarm alarm = new Alarm();<br /> header.addObserver(display);<br /> display.addObserver(alarm);<br /> header.boilWater();<br /> }<br />}<br />