關於上面23中設計模式的大概介紹能夠參考博客[2]。java
從一個燒開水的例子出發。如今咱們有個熱水器,咱們用它來燒開水。在燒水的過程當中,顯示器和揚聲器都一直監視水溫。顯示器將水溫顯示在顯示屏上。另外,當水溫超過90度時,揚聲器開始發出警告,提示水快燒開。編程
Java對觀察者類的支持,主要體如今Observable類和Observer接口。設計模式
Observable類的主要方法:框架
public class Observable { void setChanged(); //設置被觀察者的狀態已經被改變 void clearChanged(); //清除被觀察者狀態的改變,此時再調用hasChanged()將返回false void addObserver(Observer observer); int countObservers(); void deleteObserver(Observer observer); void deleteObservers(); boolean hasChanged(); void notifyObservers(); void notifyObservers(Object arg); // 參數通常設定爲被改變的屬性 }
熱水器類繼承自Observerable類,做爲一種具體的被監控對象:編程語言
public class Heater extends Observable { private int temperature; // get方法,返回水溫 public int getTemperature(){ return temperature; } // set方法,設置水溫 public void setTemperature(int temperature){ this.temperature = temperature; } // boilWater方法,燒水 public void boilWater(){ for(int i = 30; i <= 100; i++){ this.setTemperature(i); this.setChanged(); this.notifyObservers(this.getTemperature()); this.clearChanged(); } } }
Observer接口只有一個抽象方法須要被具體的觀察者實現。測試
public interface Observer{ void update(Observable observable, Object arg); //這裏的arg即Obserbale類裏的notifyObservers(Object arg)傳過來的參數 }
Note:當被觀察者調用nofityObservers(*)方法時,會根據被觀察者的hasChanged()方法來判斷它的狀態是否被改變。若是改變,則觀察者調用update方法。不然不調用(即不更新)。this
顯示器和揚聲器做爲具體的熱水器水溫監視者,都須要實現Observer接口。對於顯示器,它的update方法做用就是更新顯示的水溫。對揚聲器,它的update方法則是在水溫超過90度時發出警告。具體代碼以下:spa
// 顯示器 public class Displayer implements Observer { public void update(Observable observable, Object arg){ display((int)arg); } public void display(int temperature){ System.out.println("Current Temperature is: " + temperature + " degree."); } } // 揚聲器 public class Alertor implements Observer { public void update(Observable observable, Object arg){ int temperature = (int) arg; if(temperature > 90){ alarm(); } } public void alarm(){ System.out.println("Warning: Temperature is over 90 degree!" ); } }
public class TestObserver{ public static void main(String[] args){ // 生成設備 Heater heater = new Heater(); Displayer displayer = new Displayer(); Alertor alertor = new Alertor(); // 添加訂閱 - 重點(!!!) heater.addObserver(display); heater.addObserver(alertor); // 燒水 heater.boilWater(); } }
import java.util.Observable; import java.util.Observer; public class TestObserver { public static void main(String[] args){ // 生成設備 Heater heater = new Heater(); Displayer displayer = new Displayer(); Alertor alertor = new Alertor(); // 添加訂閱 heater.addObserver(displayer); heater.addObserver(alertor); // 燒水 heater.boilWater(); } } class Heater extends Observable { private int temperature; // get方法,返回水溫 public int getTemperature(){ return temperature; } // set方法,設置水溫 public void setTemperature(int temperature){ this.temperature = temperature; } // boilWater方法,燒水 public void boilWater(){ for(int i = 30; i <= 100; i++){ this.setTemperature(i); this.setChanged(); this.notifyObservers(this.getTemperature()); // 只需傳入監視器感興趣的變量 this.clearChanged(); } } } // 顯示器 class Displayer implements Observer { public void update(Observable observable, Object arg){ display((int)arg); } public void display(int temperature){ System.out.println("Displayer: Current Temperature is: " + temperature + " degree."); } } // 揚聲器 class Alertor implements Observer { public void update(Observable observable, Object arg){ int temperature = (int) arg; if(temperature > 90){ alarm(); } } public void alarm(){ System.out.println("Alertor: Warning: Temperature is over 90 degree!" ); } }
最後的輸出結果爲:.net
Displayer: Current Temperature is: 30 degree. Displayer: Current Temperature is: 31 degree. Displayer: Current Temperature is: 32 degree. ... Displayer: Current Temperature is: 90 degree. Displayer: Current Temperature is: 91 degree. Alertor: Warning: Temperature is over 90 degree! Displayer: Current Temperature is: 92 degree. Alertor: Warning: Temperature is over 90 degree! ... Displayer: Current Temperature is: 99 degree. Alertor: Warning: Temperature is over 90 degree! Displayer: Current Temperature is: 100 degree. Alertor: Warning: Temperature is over 90 degree!
第一次寫技術博客感受比較費勁。原覺得一個下午能把三種實現方法都寫完的,結果只寫完了Java部分。後續的Objective-C 和C#部分計劃明天下午搞定。敬請期待。設計
歡迎交流和討論^_^ ~ 若有任何問題,請發送到郵箱:fengfu0527@gmail.com
[1]. 《Design Patterns: Elements of Reusable Object-Oriented Software》
[2]. Java之美之設計模式,連接:http://bolg.csdn.net/zhangerqing/article/details/8194653
[3]. 《Java與模式》