国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

設計模式(3)--觀察者模式

2019-11-06 06:02:04
字體:
來源:轉載
供稿:網友

一、觀察者模式定義

觀察者模式,也叫做發布-訂閱者模式,是屬于行為型模式中的一種,定義了對象之間的一對多依賴,這樣一來,當一個對象改變狀態時,它的所有依賴者都會收到通知并自動更新。

主題是真正擁有數據的人,觀察者是主題的依賴者,在數據變化時更新,這樣比起讓許多對象控制同一份數據來,可以得到更干凈的OO設計。

二、觀察者模式代碼實例

package SubjectAndObserver;/** * Created by L_kanglin on 2017/3/7. * 主題接口 */public interface Subject { //用來注冊觀察者 public void registerObserver(Observer o); //用來刪除觀察者 public void removeObserver(Observer o); //當主題狀態改變時,這個方法會被調用,以通知所有的觀察者 public void notifyObservers();}/** * Created by L_kanglin on 2017/3/7. * 觀察者接口 */public interface Observer { public void update(float temp,float humidity,float PRessure);}/** * Created by L_kanglin on 2017/3/7. * 顯示接口 */public interface DisplayElement { public void display();}/** * Created by L_kanglin on 2017/3/7. * 實現了Subject接口 */public class WeatherData implements Subject { private ArrayList observers; private float temperature; private float humidity; private float pressure; //用來記錄觀察者 public WeatherData(){ observers= new ArrayList(); } @Override //注冊觀察者 public void registerObserver(Observer o) { observers.add(o); } @Override //移除觀察者 public void removeObserver(Observer o) { int i = observers.indexOf(o); if(i>0){ observers.remove(i); } } @Override //更新當前消息 public void notifyObservers() { for(int i=0;i<observers.size();i++){ Observer observer = (Observer)observers.get(i); observer.update(temperature,humidity,pressure); } } //通知觀察者 public void measurementsChanged(){ notifyObservers(); } public void setMeasuremnets(float temperature,float humidity,float pressure){ this.temperature=temperature; this.humidity=humidity; this.pressure=pressure; measurementsChanged(); }}/** * Created by L_kanglin on 2017/3/7. * 實現觀察者接口和顯示接口 */public class CurrentConditionDisplay implements Observer,DisplayElement { private float temperature; private float humidity; private Subject weatherData; //注冊對象 public CurrentConditionDisplay(Subject weatherData) { this.weatherData=weatherData; weatherData.registerObserver(this); } @Override public void update(float temperature, float humidity, float pressure) { this.temperature=temperature; this.humidity=humidity; display(); } @Override public void display() { System.out.println("Current conditions:"+ temperature + " F degrees and "+humidity+"% humidity"); }}/** * Created by L_kanglin on 2017/3/7. * 一個測試觀察者模式的小程序,顯示當前的溫度壓力和濕度 */public class WeatherStation { public static void main(String[] args){ WeatherData weatherData = new WeatherData(); CurrentConditionDisplay currentConditionDisplay =new CurrentConditionDisplay(weatherData); weatherData.setMeasuremnets(80,65,30.4f); weatherData.setMeasuremnets(72,68,44.5f); weatherData.setMeasuremnets(52,88,35.4f); }}

上述代碼中主要是定義的Subject、Observer以及DisplayElement三個接口。 關于觀察者,主題只知道觀察者實現了某個接口(也就是Observer接口)。主題不知道觀察者的具體類是誰,做了些什么,或其它的任何細節。而這正是觀察者模式的優點,為了交互對象之間的松耦合設計而努力,改變主題或者觀察者其中一方,并不會影響到另一方。就是由于兩者的松耦合特性。

文章只是作為自己的學習筆記,借鑒了網上的許多案例,如果覺得闊以的話,希望多交流,在此謝過…


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 凤山县| 西藏| 武隆县| 思南县| 航空| 临高县| 尉犁县| 东宁县| 武隆县| 肥西县| 新宁县| 聂拉木县| 乌拉特中旗| 溧水县| 德钦县| 孙吴县| 新干县| 兖州市| 历史| 得荣县| 桦南县| 惠东县| 明水县| 吉安市| 库车县| 濉溪县| 阳江市| 淳化县| 太和县| 蕉岭县| 九台市| 饶河县| 漯河市| 吉首市| 烟台市| 常山县| 富源县| 台东县| 沈阳市| 卢氏县| 新郑市|