国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

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

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

2019-11-10 20:25:59
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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

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

——Shulin

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

1、概念

        

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

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

2、針對(duì)的問(wèn)題

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

適用性:

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

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

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

3、角色組成

? 抽象主題(Subject)角色:

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

? 具體主題(ConcreteSubject)角色:

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

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

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

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

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

4、舉例說(shuō)明

4.1、例子描述

        該實(shí)例模擬了燒水的過(guò)程,涉及三個(gè)對(duì)象,Heater(熱水器),Display(顯示器),Alarm(報(bào)警器)。模擬過(guò)程:為了便于運(yùn)行,水的初始化溫度為90,沸點(diǎn)為100,顯示器依據(jù)熱水器顯示溫度,顯示器顯示溫度為100時(shí),報(bào)警器開(kāi)始報(bào)警。明顯可以看出Heater是subject ,Display 是它的 Obsrver,同時(shí)Display亦是subject,因?yàn)樗粓?bào)警器觀察,所以Alarm是Display的Observer.

4.2、類(lèi)圖

(PS:如果不知道各種符號(hào)的意思,看這里——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>();      /**      * 注冊(cè)觀察者對(duì)象      * @param observer  觀察者      */      public void registerObserver(Observer observer){          list.add(observer);          System.out.println("注冊(cè)了一個(gè)觀察者角色!");      }      /**      * 刪除觀察者對(duì)象      * @param observer  觀察者      */      public void removeObserver(Observer observer){          list.remove(observer);      }      /**      * 通知所有注冊(cè)的觀察者對(duì)象,我的狀態(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)); //通知所有注冊(cè)的觀察者          }      }  }  

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

[java] view plain copy print?package org.zsl.designmodel.observer;    /**  * 顯示器,既是觀察者又是被觀察者  * @author Administrator  *  */  public class Display extends Subject implements Observer {      private boolean isBoiled = false;   //表示水是否燒開(kāi)了      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)警器響了,水溫超過(guò)100度了。");          }      }    }  

測(cè)試

[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、支持松耦合和減少依賴(lài)性

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

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

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

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

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

6、缺點(diǎn)

a、性能降低。

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

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

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

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

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

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

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


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
最近中文字幕mv2018在线高清| 99在线视频影院| 啪啪免费视频一区| 日本视频一二三区中文字幕| 伊人中文在线| 欧美日韩一区二区三区在线播放| 国产欧美日韩专区| 国产香蕉视频在线观看| 国产一区二区三区不卡在线| 国产麻豆精品一区二区三区v视界| www.大网伊人| 日本高清中文字幕在线| 另类专区欧美| 国产精品视频一区二区免费不卡| 日本最新在线视频| 国产午夜在线观看| 国产福利小视频在线观看| 国产网站免费看| av在线1区2区| 自拍av在线| 亚洲人成影院在线| 国产精品日日爱| 免费av在线| 在线视频福利| 中文字幕在线视频不卡| www.超级碰| 国产xxxxx| 天天av综合网| sese一区| 亚洲xxxxxx| 国产精品入口麻豆免费观看 | 久久综合精品视频| 丁香视频免费观看| 国产精品理人伦一区二区三区| 伊人电影在线观看| 丁香视频免费观看| 久草视频国产| 欧美韩日国产| 欧美色第一页| 国产经典三级在线| 国产一二三区在线| 国产美女高潮| 国产中文在线| 国产九色porn网址| 久久精品亚洲7777影院| www.操操操| 欧美成人精品福利网站| xxx国产精品| 日日夜夜中文字幕| 免费日本黄色| 国产乱xxⅹxx国语对白| 国产精品综合久久久久| 成人免费一区二区三区牛牛| 青青草视频在线免费观看| 日本高清中文字幕二区在线| 日韩黄色成人| 久久五月精品中文字幕| 激情亚洲综合网| 国产一区精品| 日本一级理论片在线大全| 国精一区二区三区| 天堂在线看视频| 97视频免费| 久久er视频| 国产黄色在线网站| 青青草视频在线观看| 国产永久免费高清在线观看视频| 久久亚洲天堂| 另类高清dbsm日本tvav| 国产羞羞视频在线播放| 伊人中文字幕在线| 福利在线国产| av福利在线观看| 尤物免费看在线视频| 亚洲综合激情六月婷婷在线观看| av文字幕在线观看| 高清欧美精品xxxxx在线看| 国产精品一区二区婷婷| 国产激情在线视频| 九九视频九九热| 国产爆初菊在线观看免费视频网站| 91视频久色| 欧美精品小视频| 国产三级自拍| 日本在线观看| 国产啊啊啊视频在线观看| 精精国产xxxx视频在线动漫 | 国产高清一区二区三区视频| 精品伦理一区二区| 懂色av一区| 日韩黄色成人| 日本视频二区| 青青草免费在线视频| 日本精品一区二区三区在线播放| 国产一级性片| 国产娇喘精品一区二区三区图片| аⅴ成人天堂中文在线| 国产黄色免费电影| 超碰国产在线观看| 日本高清不卡中文字幕| 伊人电影在线观看| 亚洲电影先锋| eeuss影院网站免费观看| 香蕉视频网站在线播放| 9色在线视频网站| 97视频网站| 亚洲www色| 在线观看中文字幕| 伊人影院在线观看| 日本天堂影院在线视频| 欧美精品日韩少妇| 最近中文字幕mv免费高清电影| 狠狠干在线视频| 亚洲欧美日韩综合精品网| 国产特级嫩嫩嫩bbb| 国产私人尤物无码不卡| 99视频资源网| 国产91足控脚交在线观看| 中文乱码字幕av网站| 亚洲欧美中文字幕在线观看| www.香蕉视频在线观看| 国产麻豆高清视频在线第一页| 久久国产综合视频| 看成年女人免费午夜视频| 好吊日视频在线观看| 国产人成在线视频| 亚洲精品国自产拍在线观看| av二区三区| www.狠狠插| 国产午夜在线视频| www.国产精| 国产特级嫩嫩嫩bbb| 天堂√中文在线| 天堂资源在线中文| 四虎久久影院| 国产精品入口麻豆高清| а√资源新版在线天堂| 中文字幕在线视频免费观看| 亚洲综合天堂网| 国产人成在线视频| 国产毛片毛片| 亚洲成人在线播放| 精品欧美不卡一区二区在线观看| 97在线超碰| 九九热在线播放| 午夜在线不卡| 精品国产福利一区二区在线 | 在线观看中文| 国产美女性感在线观看懂色av| 国产黄大片在线观看画质优化| 国产成人午夜| 热99re久久精品这里都是免费| 国产精品乱码一区二区三区视频 | 国产日产精品久久久久久婷婷| 91xx在线观看| 久久久久久国产视频| 国产成人va亚洲电影| 国产精品一区二三区| 欧美精品小视频| www555久久| 日本不卡影院| 日本动漫理论片在线观看网站| 中文资源在线网| 国产毛片毛片毛片| 狠狠操天天操夜夜操| www.91在线播放| 亚洲jjzzjjzz在线观看| 亚洲欧美自拍另类| 国产激情视频网址| 国产不卡在线| 在线观看av网站永久| 亚洲男人网站| av在线free| 黄色三级视频在线观看| 91av久久| 国产黄色av免费看| 夜色资源网av在先锋网站观看| 国产黄色大片在线观看| 国产亚洲精品久久久久久青梅 | 超碰97在线免费观看| 在线观看国产视频| 欧美日韩视频精品二区| 国产在线观看网站| 可以免费看污视频的网站| 精品中文字幕不卡在线视频| 国产精品一区二三区| 国产精品美女一区二区三区四区| 国产偷激情在线| 国产素人视频在线观看| 69国产精品视频| www.99av| 国产一二三区精品视频| 国产9色视频| 日本不卡视频一区二区| 中文字幕在线免费观看| 国产成人午夜电影| 国产综合视频一区二区三区免费| 国产亚洲依依| 永久免费网站在线| 中文字幕人成高视频|