日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

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

設計模式——觀察者模式(Observer)

2019-11-10 20:25:59
字體:
來源:轉載
供稿:網友

要想正確理解設計模式,首先必須明確它是為了解決什么問題而提出來的。

設計模式學習筆記,歡迎交流。

——Shulin

轉載請注明出處:http://blog.csdn.net/zhshulin

1、概念

        

        觀察者模式是對象的行為模式,外號非常多...??!又叫發布-訂閱(Publish/Subscribe)模式、模型-視圖(Model/View)模式、源-監聽器(Source/Listener)模式或從屬者(Dependents)模式。

        觀察者模式定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態上發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。

2、針對的問題

被觀察者對象在狀態變化時,通知所有觀察者對象,使它們能夠自動更新自己。保證整體的數據一致性。此種模式通常被用來實現事件處理系統。

適用性:

1). 當一個抽象模型有兩個方面,其中一個方面依賴于另一方面。將這二者封裝在獨立的對 象中以使它們可以各自獨立地改變和復用。

2). 當對一個對象的改變需要同時改變其它對象,而不知道具體有多少對象有待改變。

3). 當一個對象必須通知其它對象,而它又不能假定其它對象是誰。

3、角色組成

? 抽象主題(Subject)角色:

    抽象主題角色把所有對觀察者對象的引用保存在一個聚集(比如ArrayList對象)里,每個主題都可以有任何數量的觀察者。抽象主題提供一個接口,可以增加和刪除觀察者對象,抽象主題角色又叫做抽象被觀察者(Observable)角色。

? 具體主題(ConcreteSubject)角色:

    將有關狀態存入具體觀察者對象;在具體主題的內部狀態改變時,給所有登記過的觀察者發出通知。具體主題角色又叫做具體被觀察者(Concrete Observable)角色。

? 抽象觀察者(Observer)角色:

    為所有的具體觀察者定義一個接口,在得到主題的通知時更新自己,這個接口叫做更新接口。

? 具體觀察者(ConcreteObserver)角色:

    存儲與主題的狀態自恰的狀態。具體觀察者角色實現抽象觀察者角色所要求的更新接口,以便使本身的狀態與主題的狀態 像協調。如果需要,具體觀察者角色可以保持一個指向具體主題對象的引用。

4、舉例說明

4.1、例子描述

        該實例模擬了燒水的過程,涉及三個對象,Heater(熱水器),Display(顯示器),Alarm(報警器)。模擬過程:為了便于運行,水的初始化溫度為90,沸點為100,顯示器依據熱水器顯示溫度,顯示器顯示溫度為100時,報警器開始報警。明顯可以看出Heater是subject ,Display 是它的 Obsrver,同時Display亦是subject,因為它要被報警器觀察,所以Alarm是Display的Observer.

4.2、類圖

(PS:如果不知道各種符號的意思,看這里——http://blog.csdn.net/zhshulin/article/details/18088633)

4.3、源碼

Subject:抽象被觀察者

[java] view plain copy PRint?package org.zsl.designmodel.observer;    import java.util.ArrayList;  import java.util.List;    /**  * 被觀察者角色  * @author ZSL  *  */  public abstract class Subject {      private List<Observer> list = new ArrayList<Observer>();      /**      * 注冊觀察者對象      * @param observer  觀察者      */      public void registerObserver(Observer observer){          list.add(observer);          System.out.println("注冊了一個觀察者角色!");      }      /**      * 刪除觀察者對象      * @param observer  觀察者      */      public void removeObserver(Observer observer){          list.remove(observer);      }      /**      * 通知所有注冊的觀察者對象,我的狀態改變咯      * @param newState      */      public void notifyAllObservers(String newState){          for(Observer observer : list){              observer.update(newState);          }      }        }  

Observer :觀察者接口,只有一個update()方法

[java] view plain copy print?package org.zsl.designmodel.observer;  /**  * 觀察者接口  * @author ZSL  *  */  public interface Observer {      /**      * 更新接口      * @param state 更新的狀態      */      public void update(String state);  }  

Heater:熱水器,一個具體被觀察者

[java] view plain copy print?package org.zsl.designmodel.observer;    public class Heater extends Subject {      private int temperature;        public int getTemperature() {          return temperature;      }        public void setTemperature(int temperature) {          this.temperature = temperature;      }            public void boilWater(){          for(int i=95;i<105;i++){              temperature = i;              this.setTemperature(temperature);   //設置新的溫度              this.notifyAllObservers(Integer.toString(temperature)); //通知所有注冊的觀察者          }      }  }  

Display:既是觀察者,又是被觀察者

[java] view plain copy print?package org.zsl.designmodel.observer;    /**  * 顯示器,既是觀察者又是被觀察者  * @author Administrator  *  */  public class Display extends Subject implements Observer {      private boolean isBoiled = false;   //表示水是否燒開了      private int displayTemperature;     //定義顯示器的溫度            public boolean isBoiled() {          return isBoiled;      }        public void setBoiled(boolean isBoiled) {          this.isBoiled = isBoiled;      }        @Override      public void update(String state) {          displayTemperature = Integer.parseInt(state);          System.out.println("當前顯示器顯示的溫度是:"+displayTemperature);          this.displayTemperature(displayTemperature);                }            private void displayTemperature(int temperature){          if(temperature>100){              this.setBoiled(true);              this.notifyAllObservers(Boolean.toString(isBoiled));          }      }  }  

Alerm:只是觀察者

[java] view plain copy print?package org.zsl.designmodel.observer;    public class Alarm implements Observer {      private String observerState;       //定義觀察者的狀態      @Override      public void update(String state) {          Boolean flag = Boolean.parseBoolean(state);          if(flag){              System.out.println("報警器響了,水溫超過100度了。");          }      }    }  

測試

[java] view plain copy print?package org.zsl.designmodel.observer;    public class Test {      public static void main(String[] args) {          Heater heater = new Heater();          Display display = new Display();          Alarm alarm = new Alarm();          heater.registerObserver(display);          display.registerObserver(alarm);          heater.boilWater();      }  }  

結果:

5、優點

a、支持松耦合和減少依賴性

客戶端不再依賴于觀察器,因為通過使用主體和 Observer 接口對客戶端進行了隔離。 許多框架具有此優點,在這些框架中的應用程序組件可以注冊為當(低級)框架事件發 生時得到通知。結果,框架將調用應用程序組件,但不會依賴于它。

b、提高了應用程序的可維護性和重用性

面向對象設計的一個原則是:系統中的每個類將重點放在某一個功能上,而不是其他方面。一個對象只做一件事情,并且將他做好。觀察者模式在模塊之間劃定了清晰的界限,提高了應用程序的可維護性和重用性。

c、觀察器數目可變

觀察器可以在運行時附加和分離,因為主體對于觀察器數目沒有任何假定。此功能在這樣的情況下是很有用的:觀察器數在設計時是未知的。例如,如果用戶在應用程序中打開的每個窗口都需要一個觀察器。

6、缺點

a、性能降低。

      在許多實現中,觀察器的 update() 方法可能與主體在同一線程中執行。如果觀察器列表很長,則執行 Notify() 方法可能需要很長時間。抽取對象依賴性并不意味著添加觀察器對應用程序沒有任何影響。

b、內存泄漏。

       在 Observer 中使用的回調機制(當對象注冊為以后調用時)會產生一個常見的錯誤,從而導致內存泄漏,甚至是在托管的 C# 代碼中。假定觀察器超出作用范圍,但忘記取消對主體的訂閱,那么主體仍然保留對觀察器的引用。此引用防止垃圾收集在主體對象也被破壞之前重新分配與觀察器關聯的內存。如果觀察器的生存期比主體的生存期短得多(通常是這種情況),則會導致嚴重的內存泄漏。

c、隱藏的依賴項。

       觀察器的使用將顯式依賴性(通過方法調用)轉變為隱式依賴性(通過觀察器)。如果在整個應用程序中廣泛地使用觀察器,則開發人員幾乎不可能通過查看源代碼來了解所發生的事情。這樣,就使得了解代碼更改的含意非常困難。此問題隨傳播級別急劇增大(例如,充當 Subject 的觀察器)。因此,應該僅在少數定義良好的交互(如 Model-View-Controller 模式中模型和視圖之間的交互)中使用觀察器。最好不要在域對象之間使用觀察器。

d、測試 / 調試困難。

    盡管松耦合是一項重大的體系結構功能,但是它可以使開發更困難。將兩個對象去耦的情況越多,在查看源代碼或類的關系圖時了解它們之間的依賴性就越難因此,僅當可以安全地忽略兩個對象之間的關聯時才應該將它們松耦合(例如,如果觀察器沒有副作用)。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲一区中文字幕在线| 中文字幕视频一区二区三区久| 91精品国产综合久久久蜜臀粉嫩| 欧美日韩国产中字 | 伊人精品视频| 国产成人va亚洲电影| 一区二区在线观| 欧美日韩亚洲第一| 日韩中文在线视频| 国产中文在线视频| 最新中文在线视频| 久久久精品福利| 日本a级黄色| 中文字幕 乱码 中文乱码91| 日韩三区免费| 亚洲视频电影在线| 欧美一级免费在线观看| 日韩视频 中文字幕| 91精品国产欧美日韩| 91精品国产乱码久久蜜臀| 欧美日韩中文字幕综合视频| 91精品啪在线观看国产60岁| 亚洲欧美999| 国产专区中文字幕| 欧美日韩亚洲一区| 欧美日韩综合在线观看| 国产不卡的av| 黄色欧美日韩| 一区二区在线高清视频| 国产视频二区| 91精品国产91久久久久青草| 91欧美日韩麻豆精品| 欧美日韩在线播放视频| 亚洲三级免费看| 日韩三级视频在线播放| 日韩视频在线一区二区| 精品视频123区在线观看| 日韩三级在线播放| 国产视频中文字幕在线观看| 欧美日韩激情一区二区三区| 日韩欧美国产亚洲| 日韩视频在线一区| 日韩精品视频在线观看网址| 国产偷久久久精品专区| 亚洲成av人综合在线观看| 免费精品国产自产拍观看| 亚洲一区不卡在线| 亚洲黄在线观看| 中文字幕亚洲一区在线观看| 一区二区精品区| 国产999在线观看| 亚洲欧美日本另类| av亚洲免费| 在线中文字幕视频观看| 久久精品99久久久久久久久| 日韩在线三区| 日韩福利视频导航| 午夜亚洲一区| 国产黄在线看| 91精品国产经典在线观看| 日本黄色一区二区三区| 日韩视频一区在线观看| 国产在线观看91| 日韩美女中文字幕| 精品久久久91| 亚洲a一级视频| 午夜一区二区视频| 91精品久久久久| 狠狠色综合色区| 欧美中文字幕在线视频| 粉嫩喷白浆久久| 欧美日韩精品综合在线 | 国产偷国产偷亚洲清高网站 | 国产无套粉嫩白浆在线2022年| 亚洲欧美中文字幕| 91久久精品网| 亚洲福利一区二区三区| 欧美日韩国产首页| 亚洲影视资源网| 国产一二三四| 亚洲免费播放| 久久久91精品国产| 国产永久免费高清在线观看| 久久精品久久精品亚洲人| 91精品视频播放| 亚洲一二三不卡| 亚洲成av人片在线| 日韩黄色在线播放| 中文字幕最新精品| 日本精品国语自产拍在线观看| 一级免费a一片| 亚洲国产91精品在线观看| 91精品国产网站| 国产专区中文字幕| 欧美中文字幕在线| 中文官网资源新版中文第二页在线观看| 欧美日韩国产区| 免费视频中文字幕| 一区二区不卡在线播放| 欧美日韩午夜在线视频| 欧美1234区| 国产一区二中文字幕在线看| 成人一区而且| 成人久久久久| 国产在线拍偷自揄拍精品| 日韩欧美国产视频| www 日韩| 精品乱子伦一区二区| 久久视频免费看| 久久riav| 欧美综合精品| 日韩亚洲欧美中文字幕| 狠狠色综合色区| 日韩免费视频一区| 国产99对白在线播放| 精品午夜av| 午夜精品一区二区三区视频免费看| 日韩视频第二页| 精品福利二区三区| 日韩精品国产欧美| 高清1区2区| 亚洲 国产 欧美 日韩| 日韩久久不卡| 一本一道久久a久久精品综合蜜臀| 91欧美日韩麻豆精品| 国产欧美日韩成人| 在线视频不卡一区二区| 欧美久久在线观看| 日韩欧美国产网站| 天天综合天天做| 免费在线亚洲| 国产在线一区二区视频| 日韩中文字幕在线观看视频| 日韩欧美不卡视频| 国产黄色精品| 日韩欧美国产高清| 国产一区久久久| 久久久99免费| av午夜在线| 91精品国产高清久久久久久| 在线观看精品国产| 亚洲第一中文字幕| 精品999视频| 久久久久久久久综合| 中文字幕高清在线播放| 日韩av一区二区在线| 亚洲区中文字幕| 亚洲制服丝袜一区| lutube成人福利在线观看| 在线日韩中文| 国产一二三四| 中文字幕日韩欧美| 久久精品欧美日韩精品| 欧美三级免费观看| 日韩亚洲欧美中文三级| 日韩午夜一区| 国产福利一区二区精品秒拍| 欧美日韩激情一区| 中文字幕不卡三区| 国产欧美一级| 午夜国产欧美理论在线播放| 99久久精品国产成人一区二区| 亚洲乱码中文字幕综合| 亚洲国产午夜精品| 日韩视频中文| 国产乱国产乱300精品| 国产高清一区| 亚洲福利一区| 亚洲一卡二卡在线观看| 日韩精品高清不卡| 久久精品最新免费国产成人| 欧美日韩久久不卡| 日韩黄色在线播放| 久草中文在线观看| 国产中文在线视频| 国产天堂素人系列在线视频| 高清一区二区| 成人福利一区| 欧美亚洲国产日韩| 国产三级在线观看视频| 又黄又www的网站| 国产69精品久久久久孕妇国产69久久| 中文字幕亚洲国产| 中文字幕精品在线| 91精品视频观看| 日韩在线视频网| 久久99精品久久久久子伦| 91精品国产综合久久蜜臀 | 日韩免费看网站| 免费在线亚洲| 中文不卡在线| 欧美中日韩在线| 亚洲高清视频一区| 国产欧美日韩中文字幕在线| 麻豆精品99| 亚洲视频在线观看日本a| 日韩亚洲欧美中文三级| av免费不卡国产观看| 国产福利一区二区| 日韩在线精品| 一区在线免费| 日韩一级视频在线观看| 精品视频三区| 日韩三级一区| 国产高清在线视频| 久久香蕉精品| 午夜一区二区三区| 91精品国产综合久久久久久| 亚洲午夜91| 日韩欧美久久| 国产在线黄色片| 欧美日韩国产首页| 日韩免费视频一区| 国产乱国产乱300精品| 欧美日韩午夜在线| 亚洲中文字幕在线一区| 国产在线高潮| 日韩欧美不卡在线| 欧美另类专区| 一区二区视频国产| 国产一区久久久| 国产绿帽一区二区三区| 中文在线日韩| 日韩中文字幕综合| 亚洲国内精品视频| 欧美日韩亚洲国内综合网俺| 正在播放日韩精品| 日韩精品视频免费看| 91精品国产91久久久久久久久| 欧美日韩国产大片| www日韩欧美| 色综合天天综合网天天狠天天| 国产欧美日韩综合精品| 内射国产内射夫妻免费频道| 亚洲黄色在线观看| 亚洲视频资源在线| 日韩欧美中文字幕一区| 国产无遮挡在线视频免费观看| 一区二区三区精品在线观看| 国产男女av| 亚洲免费精品| 中文字幕精品一区二| 高清在线一区| 亚洲一区在线视频观看| 欧美三级网址| 日韩在线视频中文字幕| 中文字幕国产亚洲| 亚洲va久久久噜噜噜久久| 九色蝌蚪视频在线| av丝袜在线| 欧美日韩一二| 精品国产91| 精品久久久视频| 精品999在线| 日韩亚洲欧美中文高清在线| 国产三级在线观看视频| 欧美日韩中文字幕| 91精品久久久久久蜜臀| 一区二区精品免费| 免费在线视频一级不卡| 国产视频一区三区| 日韩欧美三级在线| 国产欧美日韩在线看| 国产资源中文字幕| 伊人网站在线| 欧美日韩精品国产| 国产一区免费视频| 久久视频免费看| 亚洲黄页一区| 久久精品在线观看| 在线观看av的网站| 欧美日韩91| 91麻豆精品国产91久久久使用方法 | 欧美日韩中文在线| 91精品国产高清| 欧美日韩91| 日韩一二三四区| 成年人黄国产| 日韩在线高清视频| 中文字幕在线观看视频www| 91精品国产手机| 69免费视频| 亚洲欧美中文字幕在线一区| 国产乱码在线| 视频一区不卡| 最新中文字幕在线| 国产视频1区| 日韩视频 中文字幕| 日韩欧美999| 69免费视频| 亚洲一区在线观看网站| 在线观看国产福利视频| 亚洲中文字幕在线一区| 欧美亚洲国产日韩2020| 精品视频国产| 国产福利一区在线观看| 国产成免费视频| 日韩欧美亚洲日产国| 中文字幕精品视频| 日韩欧美中文字幕一区| 日韩欧美久久久| 亚洲欧美伊人| 国产欧美日韩在线看| 欧美不卡一二三| 日韩欧美国产网站| 91精品久久久久久蜜臀| 91精品视频观看| 亚洲免费观看在线观看| 国产一级在线免费观看| 亚洲综合在线视频| 日韩欧美在线精品| 国产黄色高清在线| 亚洲最新免费视频| 色综合久久88色综合天天免费| 久久久久久欧美| 91精品综合久久久久久| 欧洲精品久久久| 欧美日韩国产一区在线| 国产成人日日夜夜| 国产婷婷精品| 在线精品观看| 91精品国产手机| 在线精品视频免费播放| 黄色国产网站在线观看| 欧美日韩国产免费| av中文网站| 精品午夜av| 欧美日韩性视频一区二区三区| 91精品在线观| www.久久久精品| 日韩精品在线视频观看| 在线视频你懂得一区| www中文字幕在线观看| 日韩欧美在线网站| 日韩在线视频免费观看高清中文| 日韩免费视频| 久久精品夜夜夜夜久久| www.久久草| eeuss一区| 日韩精品视频在线观看视频| 在线日韩欧美| 中文字幕精品视频| 国产极品嫩模在线视频一区 | 日韩三级一区| 欧美日韩中文| 一级日本免费的| 日韩在线观看a| 国产三级做爰在线观看| 久久精品www| 日韩精品中文在线观看| 激情婷婷亚洲| 91精品国产91久久久久青草| 亚洲黄色www| 亚洲欧美999| 国产第一页在线播放| 久精品在线观看| 亚洲乱码中文字幕| 久久久另类综合| 国产黄色在线播放| 午夜少妇久久久久久久久| а√天堂8资源中文在线| 欧美 日韩 国产在线| 欧美在线日韩| 久久99精品久久久久子伦| 中文字幕在线视频网| 大香一本蕉伊线亚洲网| 日韩亚洲欧美中文在线| 亚洲 欧美 中文字幕| 精品日韩视频在线观看| 精品欧美久久久| 91精品国产自产在线观看永久∴| 在线视频亚洲| 欧美午夜影院在线视频| 日韩专区视频网站| 久久精品在线免费观看| 日韩三级精品| 亚洲视频日韩| 91蜜桃婷婷狠狠久久综合9色| 欧美xxxx中国| 国产欧美日韩在线观看| 亚洲三级网站| 亚洲成av人片| 91精品国产色综合久久久蜜香臀| 欧美国产日韩在线播放| 亚洲一区中文在线| 在线一区二区三区精品| 一区二区三区在线免费| 中文字幕日韩视频| 免费在线视频一级不卡| 国产中文在线视频| 日韩欧美在线视频日韩欧美在线视频| 欧美日韩在线观看首页| 一二三区精品视频| 欧美日韩综合色| 国产欧美日韩高清| 欧美日韩国产免费| 中文字幕精品视频| 色www精品视频在线观看| www.av中文字幕| 中文字幕在线观看亚洲|