国产探花免费观看_亚洲丰满少妇自慰呻吟_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接口)。主題不知道觀察者的具體類是誰,做了些什么,或其它的任何細節。而這正是觀察者模式的優點,為了交互對象之間的松耦合設計而努力,改變主題或者觀察者其中一方,并不會影響到另一方。就是由于兩者的松耦合特性。

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 涞源县| 镇巴县| 出国| 阳山县| 淄博市| 樟树市| 满洲里市| 天门市| 塔河县| 田东县| 庆安县| 砚山县| 资溪县| 长寿区| 盈江县| 社会| 天津市| 伊金霍洛旗| 宁德市| 福州市| 阿勒泰市| 东乡族自治县| 安庆市| 基隆市| 泉州市| 沂源县| 京山县| 类乌齐县| 莱芜市| 本溪| 任丘市| 五常市| 巢湖市| 香河县| 海伦市| 房产| 柳江县| 客服| 长宁区| 稻城县| 深州市|