程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> 設計模式--觀察者模式

設計模式--觀察者模式

編輯:JAVA編程入門知識

《Head First 設計模式》

1.觀察者模式:定義了對象之間的一對多依賴,這樣一來,當一個(主題)對象改變狀態時,它的所有依賴都會收到通知並自動更新。

        我喜歡看報紙,於是我訂閱了《人民日報》。那麼,《人民日報》每次的新聞都會告訴我(誰讓我買了報那)。

       a. 這個報社不僅僅我一個人訂閱。(報社與我(對象之間)是一對多的依賴)。

       b.報社每天的更新信息(一個(主題)對象改變了狀態)。

       c.報社把信息發給每個人訂閱的人,這樣訂閱的人就可以更新時事(它的所有依賴都會收到通知並自動更新)。

        現在很清晰了,把《人民日報》看做主題,我(以及其他訂閱報紙的人)就是觀察者。作為觀察者,我不需要了解《人民日報》出版社的信息(主題的具體信息)。

我就知道《人民日報》更新了信息會告訴我。《人民日報》出版社也沒心思了解我,他就知道有一個人訂閱了該報,然後發行報紙的時候給我一份就可以了。

 

設計原則:找出程序中變化的方面,然後將其和固定不變的方面相分離。

         我和《人民日報》是一種十分松散的耦合。假如我不再訂閱《人民日報》,他也不需要修改內容(觀察者放棄觀察這個主題,主題也不需要修改代碼去針對該觀察者)。

  《人民日報》只不過知道有個人不再訂閱,以後不用發報紙給他了(主題把記錄的觀察者對象刪除)。

        主題的內容發生改變的時候,不需要修改觀察者。觀察者的數量等發生改變的時候,不需要修改主題。

 

設計原則:針對接口編程,而非針對實現編程。

            把觀察者統一實現一個接口,主題只需要向該接口實現內容,而不需要面向每個觀察者。

           訂閱的人太多了,要是能統一管理就好了。於是,有了報刊(接口),出版社只需要針對報刊發布報紙就可以了,不需要繁瑣的向每個人發報。(該例可能不太好)

 

 

小結:

  • 觀察者模式定義了對象之間一對多的關系。
  • 主題用一個共同的接口來更新觀察者。
  • 觀察者和主題之間松散耦合,主題不知道觀察者的細節。
  • 使用次模式時,也可以運行觀察者主動去拿自己的信息,但是最好還是主題推送數據。
  • 有多個觀察者時,幣可以依賴特定的通知順序。
  • java有多種觀察者模式的實現,包括了通用的java.util.Observable。該類可以方便的實現觀察者模式。
  • java.util.Observable違反了:針對接口編程。所以有自己的局限性。
  • 有必要可以自己實現該模式,很簡單。
  • Swing中也被大量使用該模式,就行按鈕的監聽。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved