亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

設(shè)計(jì)模式——觀察者模式(Observer)

2019-11-10 20:25:59
字體:
供稿:網(wǎng)友

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

設(shè)計(jì)模式學(xué)習(xí)筆記,歡迎交流。

——Shulin

轉(zhuǎn)載請注明出處:http://blog.csdn.net/zhshulin

1、概念

        

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

        觀察者模式定義了一種一對多的依賴關(guān)系,讓多個(gè)觀察者對象同時(shí)監(jiān)聽某一個(gè)主題對象。這個(gè)主題對象在狀態(tài)上發(fā)生變化時(shí),會(huì)通知所有觀察者對象,使它們能夠自動(dòng)更新自己。

2、針對的問題

被觀察者對象在狀態(tài)變化時(shí),通知所有觀察者對象,使它們能夠自動(dòng)更新自己。保證整體的數(shù)據(jù)一致性。此種模式通常被用來實(shí)現(xiàn)事件處理系統(tǒng)。

適用性:

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

2). 當(dāng)對一個(gè)對象的改變需要同時(shí)改變其它對象,而不知道具體有多少對象有待改變。

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

3、角色組成

? 抽象主題(Subject)角色:

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

? 具體主題(ConcreteSubject)角色:

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

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

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

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

    存儲(chǔ)與主題的狀態(tài)自恰的狀態(tài)。具體觀察者角色實(shí)現(xiàn)抽象觀察者角色所要求的更新接口,以便使本身的狀態(tài)與主題的狀態(tài) 像協(xié)調(diào)。如果需要,具體觀察者角色可以保持一個(gè)指向具體主題對象的引用。

4、舉例說明

4.1、例子描述

        該實(shí)例模擬了燒水的過程,涉及三個(gè)對象,Heater(熱水器),Display(顯示器),Alarm(報(bào)警器)。模擬過程:為了便于運(yùn)行,水的初始化溫度為90,沸點(diǎn)為100,顯示器依據(jù)熱水器顯示溫度,顯示器顯示溫度為100時(shí),報(bào)警器開始報(bào)警。明顯可以看出Heater是subject ,Display 是它的 Obsrver,同時(shí)Display亦是subject,因?yàn)樗粓?bào)警器觀察,所以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("注冊了一個(gè)觀察者角色!");      }      /**      * 刪除觀察者對象      * @param observer  觀察者      */      public void removeObserver(Observer observer){          list.remove(observer);      }      /**      * 通知所有注冊的觀察者對象,我的狀態(tài)改變咯      * @param newState      */      public void notifyAllObservers(String newState){          for(Observer observer : list){              observer.update(newState);          }      }        }  

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

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

Heater:熱水器,一個(gè)具體被觀察者

[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);   //設(shè)置新的溫度              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("當(dāng)前顯示器顯示的溫度是:"+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;       //定義觀察者的狀態(tài)      @Override      public void update(String state) {          Boolean flag = Boolean.parseBoolean(state);          if(flag){              System.out.println("報(bào)警器響了,水溫超過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();      }  }  

結(jié)果:

5、優(yōu)點(diǎn)

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

客戶端不再依賴于觀察器,因?yàn)橥ㄟ^使用主體和 Observer 接口對客戶端進(jìn)行了隔離。 許多框架具有此優(yōu)點(diǎn),在這些框架中的應(yīng)用程序組件可以注冊為當(dāng)(低級)框架事件發(fā) 生時(shí)得到通知。結(jié)果,框架將調(diào)用應(yīng)用程序組件,但不會(huì)依賴于它。

b、提高了應(yīng)用程序的可維護(hù)性和重用性

面向?qū)ο笤O(shè)計(jì)的一個(gè)原則是:系統(tǒng)中的每個(gè)類將重點(diǎn)放在某一個(gè)功能上,而不是其他方面。一個(gè)對象只做一件事情,并且將他做好。觀察者模式在模塊之間劃定了清晰的界限,提高了應(yīng)用程序的可維護(hù)性和重用性。

c、觀察器數(shù)目可變

觀察器可以在運(yùn)行時(shí)附加和分離,因?yàn)橹黧w對于觀察器數(shù)目沒有任何假定。此功能在這樣的情況下是很有用的:觀察器數(shù)在設(shè)計(jì)時(shí)是未知的。例如,如果用戶在應(yīng)用程序中打開的每個(gè)窗口都需要一個(gè)觀察器。

6、缺點(diǎn)

a、性能降低。

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

b、內(nèi)存泄漏。

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

c、隱藏的依賴項(xiàng)。

       觀察器的使用將顯式依賴性(通過方法調(diào)用)轉(zhuǎn)變?yōu)殡[式依賴性(通過觀察器)。如果在整個(gè)應(yīng)用程序中廣泛地使用觀察器,則開發(fā)人員幾乎不可能通過查看源代碼來了解所發(fā)生的事情。這樣,就使得了解代碼更改的含意非常困難。此問題隨傳播級別急劇增大(例如,充當(dāng) Subject 的觀察器)。因此,應(yīng)該僅在少數(shù)定義良好的交互(如 Model-View-Controller 模式中模型和視圖之間的交互)中使用觀察器。最好不要在域?qū)ο笾g使用觀察器。

d、測試 / 調(diào)試?yán)щy。

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


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
色影视在线视频资源站| 欧美丰满老妇厨房牲生活| 国产在线精品一区二区| 久久国产一区| 欧美巨大xxxx做受沙滩| 37pao成人国产永久免费视频| 催眠调教后宫乱淫校园| 中文字幕一区二区三区久久网站| 日日操免费视频| 秋霞在线观看一区二区三区| 久久午夜夜伦鲁鲁片| 欧美黄色一级大片| 毛片在线视频| 大片免费播放在线视频| 少妇被躁爽到高潮无码文| 九色在线播放| 成人午夜国产| 视频一区二区精品| 日本一区高清不卡| 国产大学生粉嫩无套流白浆| 最新国产精品亚洲| 麻豆亚洲av成人无码久久精品| 午夜影院免费版| 国产在线播放av| eeuss影院www在线观看手机| 91精品国产综合久久久蜜臀粉嫩| 色哟哟免费在线观看| 国产亚洲欧美日韩在线观看一区二区| 欧美图片一区二区| 欧美日韩精品一区二区三区视频播放| 三级黄色片网站| 欧美日韩免费观看一区| 国产精品合集一区二区| 91在线高清视频| 欧产日产国产精品98| 婷婷激情综合网| 在线播放一区二区精品产| 欧美高清视频www夜色资源网| 亚洲人成在线观看| 91精品啪在线观看国产81旧版| 露脸国产精品自产在线播| 精品人妻一区二区三区浪潮在线| 欧美影视一区二区三区| 中文字幕一区二区精品| 国产精品久久久久久久久妇女| 国产成人精品免费在线| 日韩av资源在线播放| 欧美日韩国产综合一区二区三区| 人妻va精品va欧美va| 欧美在线观看视频一区二区| 国产精品视频免费一区二区三区| 国内国产精品天干天干| 欧美日韩成人免费视频| 久久久噜噜噜| 欧美一区二区免费观在线| av电影免费在线| 日本激情视频在线观看| 草草地址线路①屁屁影院成人| 91亚洲精品久久久蜜桃| 中文字幕 人妻熟女| 蜜桃av免费看| 精品高清一区二区三区| 蜜臀精品一区二区三区在线观看| 久久综合九色综合久久久精品综合| eeuss性xxxxxx电影| 美女的尿口免费视频| 国产亚洲自拍一区| 精品三级久久久| 亚洲伊人av| 99在线精品视频免费观看20| 无码h黄肉3d动漫在线观看| 日韩一区亚洲二区| 国产精品国产三级在线观看| 美女一区二区久久| 超薄肉色丝袜一二三| 美女爆乳18禁www久久久久久| 精品1卡二卡三卡四卡老狼| 欧美va亚洲va日韩∨a综合色| 日日狠狠久久偷偷综合色| 北岛玲一区二区三区四区| 国产探花一区二区三区| 一区二区三区四区免费视频| 日本一区二区三区免费看| 一区二区三区国产精品| 成人午夜在线影院| 草草在线观看| heyzo国产| 97色伦亚洲国产| 日韩和的一区二区| 亚洲女人天堂成人av在线| 国产精品日韩欧美大师| 国产综合欧美在线看| 日本大胆欧美人术艺术动态| 成人444kkkk在线观看| 国产精品1区2区3区| 青青草成人网| 国产一区二区三区成人欧美日韩在线观看| 国产精品入口久久| 亚洲国产精品狼友在线观看| 久久精品72免费观看| 精品卡一卡卡2卡3网站| 一区二区三区四区欧美| 牲欧美videos精品| 天堂蜜桃一区二区三区| 成人短视频在线观看| 欧美日韩视频免费在线观看| 亚洲人成网站77777在线观看| 亚洲成人在线电影| 在线综合亚洲欧美在线视频| 亚洲精华国产欧美| 豆国产97在线 | 亚洲| 在线看片第一页欧美| av中文字幕一区| 蜜桃视频在线观看一区二区| 欧洲成人一区二区| 最近中文字幕免费观看| 黄色三级网站在线观看| 精品1区2区3区| 男人与禽猛交狂配| 日韩有吗在线观看| 人妻丰满熟妇av无码久久洗澡| 成人在线激情网| 天天操人人爽| 国产成人精品无码免费看夜聊软件| 国产欧美日韩一区二区三区在线观看| 你懂的免费在线观看| 99精品1区2区| 久久精品偷拍视频| 亚洲无吗一区二区三区| 成人在线免费看片| 三上悠亚 电影| 一起操在线观看| 在线观看免费观看在线91| 成人在线二区| 无遮挡又爽又刺激的视频| www.一区二区三区.com| 日本在线视频播放| 蜜臀av一级做a爰片久久| 国产精品黄色大片| 精品福利一二区| av美女网站| 99久久99久久精品国产片果冻| 久久国产精品电影| 免费观看成人毛片| 日本一二三视频| …久久精品99久久香蕉国产| 色视频一区二区| 日韩精品在线观看网站| 欧美另类激情| 成人免费无遮挡无码黄漫视频| 久久一区中文字幕| 在线精品亚洲一区二区不卡| 欧美日韩在线另类| 国产浮力第一页| 欧美成人vps| 色视频欧美一区二区三区| 欧美日韩一区二区三区在线播放| 99成人超碰| 久久精品一区二区三区不卡免费视频| 超在线视频97| caoporn超碰国产公开| 亚洲色偷偷综合亚洲av伊人| 日本激情免费| 亚洲美免无码中文字幕在线| 亚洲电影有码| 日本欧美在线| 欧美日韩在线视频一区二区| 中文字幕在线三区| 品久久久久久久久久96高清| 三上悠亚作品在线观看| 国产东北露脸精品视频| eeuss影院www免费影院| 日本免费在线观看视频| 91在线网址| 日本午夜精品理论片a级appf发布| 丝袜美腿av在线| 一区二区欧美国产| 成人免费黄色| 午夜精品成人在线| 午夜一区二区三区| 久久久久久久久久久久久久| 青青草原国产在线观看| 可以在线看的av网站| 国产精品1luya在线播放| 和岳每晚弄的高潮嗷嗷叫视频| 欧美成人精品一区二区男人小说| bbw在线视频| 99久re热视频精品98| 欧美精品一区二区蜜臀亚洲| 不用播放器的免费av| 波多野结衣的一区二区三区| 午夜免费福利视频| 一区二区三区视频在线看| 国产原厂视频在线观看| 国产精品23p| 国产69久久精品成人看| 国产一区二区在线观看免费播放| 中文字幕在线视频不卡| 日韩午夜高潮| 黄色三级网站在线观看| 深爱激情综合| 中国丰满人妻videoshd| 一夜七次郎国产精品亚洲| caoporn成人免费视频在线| 精品亚洲aⅴ在线观看| 综合自拍亚洲综合图不卡区| 亚洲精品国产欧美| 久久成人人人人精品欧| 亚洲国产精品自拍| 国产精品成人免费精品自在线观看| 成人亚洲精品777777ww| 亚洲精品一二三区| 欧美激情xxxx性bbbb| 午夜亚洲性色视频| 最新中文字幕一区二区三区| 992tv在线观看在线播放| 精品无码一区二区三区在线| 成人精品美女隐私视频| 香蕉久久99| 91色琪琪电影亚洲精品久久| 欧美精品一区二区三区久久久竹菊| 亚洲一级一区| 国产精品815.cc红桃| 亚洲专区欧美专区| 亚洲人成77777在线观看网| 在线观看欧美日本| 亚洲一区色图| 99久久精品免费观看国产| av网站导航在线观看免费| 国产成人久久久精品一区| 色综合久久久无码中文字幕波多| 卡通动漫精品一区二区三区| 欧美在线一区二区三区四| 337p日本欧洲亚洲大胆鲁鲁| 日本另类视频| 亚洲影院理伦片| 国产乱码精品一区二区亚洲| 日韩欧美一中文字暮专区| 中文一区二区三区四区| 国产美女极度色诱视频www| 国产免费1000拍拍拍| 午夜欧美2019年伦理| 伊人精品在线视频| 亚洲一区二区三区av无码| 精品久久久久久久| 亚洲综合av一区| 理论片在线观看理伦片| 在线观看精品一区二区三区| 美女做暖暖视频免费在线观看全部网址91| 日产精品久久久久久久蜜臀| 婷婷综合久久一区二区三区| 欧美free性| 中文字幕在线播放一区二区| 人九九综合九九宗合| 蜜臀精品一区二区三区在线观看| h片视频在线观看| 欧美三根一起进三p| 天天干免费视频| 国产真实久久| 夜夜未满十八勿进的爽爽影视| 亚洲成人av一区二区三区| 一级片视频免费| 久久99国产精品免费网站| 亚洲熟妇av日韩熟妇在线| 九九热免费精品视频| 欧美黑人极品猛少妇色xxxxx| av中文字幕网址| 日韩电影在线观看一区二区| 怡红院亚洲色图| 欧美人与牲动交xxxx| 成人综合一区| 亚洲精品1区2区| 欧美性生活大片视频| 国产乱淫av一区二区三区| 欧美在线三级| 亚洲黄页在线观看| 一本色道久久综合无码人妻| 女教师高潮黄又色视频| 亚洲欧美电影一区二区| 精选一区二区三区四区五区| 国产成人精品网站| 国产精品电影在线观看| 欧美一级二级三级区| 欧美成人午夜77777| 国产日韩视频一区| 一级久久久久久久| 999久久久国产999久久久| 欧美色视频日本版| 欧美国产日韩一区二区| 一本久久知道综合久久| 精品国产凹凸成av人网站| 法国空姐电影在线观看| 欧美经典影片视频网站| 国产精品久久三区| 日韩中文字幕在线观看视频| 一区二区激情小说| 欧美高清电影在线看| 久久亚洲精精品中文字幕| 欧美三级日韩三级国产三级| 日本午夜精品一区二区三区电影| 亚洲成年人影院| 天堂在线观看视频观看www| 国产一区红桃视频| 中文字幕一区二区不卡| 波多野结衣办公室33分钟| 精品国产一区二区三| 在线精品亚洲欧美日韩国产| 国产欧美一区二区三区久久人妖| 精品免费国产一区二区| 激情亚洲影院在线观看| 日本三级在线观看网站| 91精品免费久久久久久久久| 男女啪啪999亚洲精品| 亚洲精品伊人| 国产精品久久久久久久久久久新郎| 色片在线免费观看| 日韩黄色免费电影| 国产欧美日韩网站| 国产电影一区二区三区爱妃记| 中文在线a在线| 日本视频不卡| 一级黄色在线| 久久久精品一区| 天天操天天干天天操天天干| 超污黄色软件| 麻豆精品在线播放| 中文字幕免费高清在线| 亚洲一区二区三区|