1. 程式人生 > >觀察者模式 (Listener監聽器)

觀察者模式 (Listener監聽器)

定義:定義物件間一種一對多的依賴關係,使得當每一個物件改變狀態,則所有依賴於它的物件都會得到通知並自動更新。

型別:行為類模式

類圖:

        在軟體系統中經常會有這樣的需求:如果一個物件的狀態發生改變,某些與它相關的物件也要隨之做出相應的變化。比如,我們要設計一個右鍵選單的功能,只要在軟體的有效區域內點選滑鼠右鍵,就會彈出一個選單;再比如,我們要設計一個自動部署的功能,就像eclipse開發時,只要修改了檔案,eclipse就會自動將修改的檔案部署到伺服器中。這兩個功能有一個相似的地方,那就是一個物件要時刻監聽著另一個物件,只要它的狀態一發生改變,自己隨之要做出相應的行動。其實,能夠實現這一點的方案很多,但是,無疑使用觀察者模式是一個主流的選擇。

觀察者模式的結構

在最基礎的觀察者模式中,包括以下四個角色:

  • 被觀察者:從類圖中可以看到,類中有一個用來存放觀察者物件的Vector容器(之所以使用Vector而不使用List,是因為多執行緒操作時,Vector在是安全的,而List則是不安全的),這個Vector容器是被觀察者類的核心,另外還有三個方法:attach方法是向這個容器中新增觀察者物件;detach方法是從容器中移除觀察者物件;notify方法是依次呼叫觀察者物件的對應方法。這個角色可以是介面,也可以是抽象類或者具體的類,因為很多情況下會與其他的模式混用,所以使用抽象類的情況比較多。
  • 觀察者:觀察者角色一般是一個介面,它只有一個update方法,在被觀察者狀態發生變化時,這個方法就會被觸發呼叫。
  • 具體的被觀察者:使用這個角色是為了便於擴充套件,可以在此角色中定義具體的業務邏輯。
  • 具體的觀察者:觀察者介面的具體實現,在這個角色中,將定義被觀察者物件狀態發生變化時所要處理的邏輯。

觀察者模式程式碼實現

  1. abstractclass Subject {  
  2.     private Vector<Observer> obs = new Vector<Observer>();  
  3.     publicvoid addObserver(Observer obs){  
  4.         this.obs.add(obs);  
  5.     }  
  6.     publicvoid delObserver(Observer obs){  
  7.         this.obs.remove(obs);  
  8.     }  
  9.     protectedvoid notifyObserver(){  
  10.         for(Observer o: obs){  
  11.             o.update();  
  12.         }  
  13.     }  
  14.     publicabstractvoid doSomething();  
  15. }  
  16. class ConcreteSubject extends Subject {  
  17.     publicvoid doSomething(){  
  18.         System.out.println("被觀察者事件反生");  
  19.         this.notifyObserver();  
  20.     }  
  21. }  
  22. interface Observer {  
  23.     publicvoid update();  
  24. }  
  25. class ConcreteObserver1 implements Observer {  
  26.     publicvoid update() {  
  27.         System.out.println("觀察者1收到資訊,並進行處理。");  
  28.     }  
  29. }  
  30. class ConcreteObserver2 implements Observer {  
  31.     publicvoid update() {  
  32.         System.out.println("觀察者2收到資訊,並進行處理。");  
  33.     }  
  34. }  
  35. publicclass Client {  
  36.     publicstaticvoid main(String[] args){  
  37.         Subject sub = new ConcreteSubject();  
  38.         sub.addObserver(new ConcreteObserver1()); //新增觀察者1
  39.         sub.addObserver(new ConcreteObserver2()); //新增觀察者2
  40.         sub.doSomething();  
  41.     }  
  42. }  

執行結果

被觀察者事件反生

觀察者1收到資訊,並進行處理。

觀察者2收到資訊,並進行處理。

        通過執行結果可以看到,我們只調用了Subject的方法,但同時兩個觀察者的相關方法都被同時呼叫了。仔細看一下程式碼,其實很簡單,無非就是在Subject類中關聯一下Observer類,並且在doSomething方法中遍歷一下Observer的update方法就行了。

觀察者模式的優點

        觀察者與被觀察者之間是屬於輕度的關聯關係,並且是抽象耦合的,這樣,對於兩者來說都比較容易進行擴充套件。

        觀察者模式是一種常用的觸發機制,它形成一條觸發鏈,依次對各個觀察者的方法進行處理。但同時,這也算是觀察者模式一個缺點,由於是鏈式觸發,當觀察者比較多的時候,效能問題是比較令人擔憂的。並且,在鏈式結構中,比較容易出現迴圈引用的錯誤,造成系統假死。

總結

       Java語言中,有一個介面Observer,以及它的實現類Observable,對觀察者角色常進行了實現。我們可以在jdk的api文件具體檢視這兩個類的使用方法。

       做過VC++、JavaScript DOM或者AWT開發的朋友都對它們的事件處理感到神奇,瞭解了觀察者模式,就對事件處理機制的原理有了一定的瞭解了。如果要設計一個事件觸發處理機制的功能,使用觀察者模式是一個不錯的選擇,AWT中的事件處理DEM(委派事件模型Delegation Event Model)就是使用觀察者模式實現的。

相關推薦

觀察模式 Listener監聽器

定義:定義物件間一種一對多的依賴關係,使得當每一個物件改變狀態,則所有依賴於它的物件都會得到通知並自動更新。 型別:行為類模式 類圖:         在軟體系統中經常會有這樣的需求:如果一個物件的狀態發生改變,某些與它相關的物件也要隨之做出相應的變化。比如,我們要設計一個右鍵選單的功能,只要在軟體的

設計模式——觀察模式C++實現

ace mes des ret rtu cto pattern virt date 1 #include <iostream> 2 #include <vector> 3 #include <algorithm>

C#設計模式(17)——觀察模式Observer Pattern

oid tar 自然 img info handler 這不 自身 dash 原文:C#設計模式(17)——觀察者模式(Observer Pattern)一、引言   在現實生活中,處處可見觀察者模式,例如,微信中的訂閱號,訂閱博客和QQ微博中關註好友,這些都屬於觀察者

C#設計模式之十六觀察模式Observer Pattern【行為型】

ngx 現實生活 松耦合 mon html 機制 account current 很好 原文:C#設計模式之十六觀察者模式(Observer Pattern)【行為型】一、引言 今天是2017年11月份的最後一天,也就是2017年11月30日,利用今天再寫一個模式,爭取

觀察模式Observer Pattern

servers his add pattern 一個 玩家 name list turn 觀察者模式又叫做訂閱/發布模式 一個Subject,多Observer 相互之間持有引用 Subject可以調用Observer的函數執行相應操作 Observer發生變動時也可以通

觀察模式Observe Pattern:簡單&粗暴解析

1.前言 在之前的文章設計模式(Design pattern):簡單&粗暴解析中已經為大家深入淺出解析了 設計模式 的 七大原則、三大型別。 本文為大家解析三大型別中 行為型 裡其中的 觀察者模式。 文章中例項 linhaojian的Github

觀察模式Observer Pattern

定義 觀察者模式也叫做釋出訂閱模式(Publish/subscribe),他是一個在專案中經常使用的模式,其定義如下: 定義物件間一種一對多的依賴關係,使得每當一個物件改變狀態,則所有依賴於他的物件都會得到通知並被自動更新。 我們現來解釋一下觀察者模式的幾個角色名稱:

手寫一個觀察模式JAVA Demo

首先理解一下觀察者模式的定義:       定義物件間一種一對多的依賴關係,使得每當一個物件改變狀態,則所有依賴於它的物件都會得到通知並被自動更新。 直譯:       建立一個一(Subject)對多(Observer)的關係,能夠使得當"一"變化的時候,依賴這個"一

設計模式觀察模式Observer Pattern

目錄 一、模式含義 觀察者模式(Observer Pattern):定義物件之間的一種一對多依賴關係,使得每當一個物件狀態發生改變時,其相關依賴物件皆得到通知並被自動更新。 觀察者模式的別名:包括釋出-訂閱(Publi

JavaScript 觀察模式 通俗易懂

觀察者模式又叫做釋出-訂閱模式。這是一種一對多的物件依賴關係,當被依賴的物件的狀態發生改變時,所有依賴於它的物件都將得到通知。 生活中的觀察者模式 就如我們在專賣店預定商品(如:蘋果手機),我們會向專賣店提交預定申請,然後店家受申請,正常這樣就完事了。假如,近段時間蘋果手機的需求

Java 設計模式——觀察模式Observer Pattern

    前言 一、簡介 二、實現步驟 (1)實現方式: (2)舉例: (3)步驟簡化版: 三、程式碼實現 四、總結 五、Demo地址 六、參考文件 七、內容推薦 前言 本來沒想寫前言的,感覺就是一堆廢話。那就當

JavaScript設計模式觀察模式學習筆記

設計模式(Design Pattern)對於軟體開發來說其重要性不言而喻,程式碼可複用、可維護、可擴充套件一直都是軟體工程中的追求!對於我一個學javascript的人來說,理解設計模式似乎有些困難,對僅切圖、做少量互動效果的FE甚至可能不會用到,但是當你開始使用Angula

設計模式觀察模式Observer Pattern

觀察者模式 觀察者模式定義了物件之間的一對多依賴,這樣一來,當一個物件改變狀態時,它的所有依賴者都會收到通知並自動更新 在觀察者模式中,發生改變的物件稱為觀察目標,而被通知的物件稱為觀察者,一個觀察目標可以對應多個觀察者。一個軟體系統常常要求在某一個物件的狀

Java設計模式觀察模式Observer Pattern

觀察者模式:類似於報紙和雜誌的訂閱 出版者+訂閱者=觀察者模式 1.報紙的業務就是出版報紙。 2.向某家報社訂閱報紙,只要他們有新報紙出版,就會給你送來。只要你是他們的訂閱使用者,你就會一直收到新報紙。 3.當你不想再看報紙時,取消訂閱,他們就不會再

Unity遊戲設計模式觀察模式Observer Pattern

        最近看遊戲設計模式,當看到觀察者模式時被搞得雲裡霧裡的,什麼觀察者,被觀察者,抽象觀察者,抽象被觀察者。聽著這些詞就覺得可怕,其實理解以後還是比較簡單的。         當我們玩遊戲時,經常會出現一些事件,而這個事件可能會影響到許多個模組時就可以用到觀察者

設計模式觀察模式例項+Demo

你能從本文了解到如下幾個方面:1. 什麼是觀察者模式?2. 如何使用觀察者模式。 3. Java中的觀察者模式的使用。 4. 總結。5. 原始碼 1. 什麼是觀察者模式? 觀察者模式又被稱為釋出訂閱模式。它定義了物件之間一對多的依賴,當一個物件狀態發

Head First設計模式觀察模式Observer Pattern

前言:     這一節開始學習觀察者模式,開始講之前會先像第一節那樣通過一個應用場景來引入該模式。具體場景為:氣象站提供了一個WeatherData物件,該物件可以追蹤獲取天氣的溫度、氣壓、溼度資訊,WeatherData物件會隨即更新三個佈告板的顯示:目前狀況(溫度、溼度、

設計模式觀察模式氣象站案例

氣象監測的應用概況 三個部分: 氣象站:獲取氣象資料的物理裝置。 WeatherData物件:a.獲取來自氣象站的資料. b.更新佈告板. 佈告板:顯示天氣狀況. WeatherData物件中含有的函式: getTemperature(); get

Java設計模式——觀察模式Observer Pattern

場景一 描述:《孫子兵法》有云:“知彼知己,百戰不殆;不知彼而知己,一勝一負;不 知彼,不知己,每戰必殆”,那怎麼才能知己知彼呢?知己是很容易的,自己的軍隊嘛,很容易知道,那怎麼知彼呢?安插間諜是很

設計模式觀察模式Observerable Pattern

1.介紹 1.1 定義 觀察者模式:觀察者模式又叫釋出-訂閱(Publish/Subscribe)模式。定義物件間一種一對多的依賴關係,每一個物件改變狀態時,則所有依賴於它的物件都會得到通知並被自動更新。 1.2 作用 使用觀察者模式可以很好的解除耦合。讓耦合的雙方都