觀察者模式-Observer Pattern

? 1.主要優點

????? 觀察者模式的主要優點如下:

????? (1) 觀察者模式可以實現表示層和數據邏輯層的分離,定義了穩定的消息更新傳遞機制,并抽象了更新接口,使得可以有各種各樣不同的表示層充當具體觀察者角色。

????? (2) 觀察者模式在觀察目標和觀察者之間建立一個抽象的耦合。觀察目標只需要維持一個抽象觀察者的集合,無須了解其具體觀察者。由于觀察目標和觀察者沒有緊密地耦合在一起,因此它們可以屬于不同的抽象化層次。

????? (3) 觀察者模式支持廣播通信,觀察目標會向所有已注冊的觀察者對象發送通知,簡化了一對多系統設計的難度。

????? (4) 觀察者模式滿足“開閉原則”的要求,增加新的具體觀察者無須修改原有系統代碼,在具體觀察者與觀察目標之間不存在關聯關系的情況下,增加新的觀察目標也很方便。

????? 2.主要缺點

????? 觀察者模式的主要缺點如下:

????? (1) 如果一個觀察目標對象有很多直接和間接觀察者,將所有的觀察者都通知到會花費很多時間。

????? (2) 如果在觀察者和觀察目標之間存在循環依賴,觀察目標會觸發它們之間進行循環調用,可能導致系統崩潰。

????? (3) 觀察者模式沒有相應的機制讓觀察者知道所觀察的目標對象是怎么發生變化的,而僅僅只是知道觀察目標發生了變化。

????? 3.適用場景

????? 在以下情況下可以考慮使用觀察者模式:

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

????? (2) 一個對象的改變將導致一個或多個其他對象也發生改變,而并不知道具體有多少對象將發生改變,也不知道這些對象是誰。

????? (3) 需要在系統中創建一個觸發鏈,A對象的行為將影響B對象,B對象的行為將影響C對象……,可以使用觀察者模式創建一種鏈式觸發機制。

4個對象:主題聚合觀察者,觀察者可以用主題的引用,也可以解耦

????? ● Subject(目標):目標又稱為主題,它是指被觀察的對象。在目標中定義了一個觀察者集合,一個觀察目標可以接受任意數量的觀察者來觀察,它提供一系列方法來增加和刪除觀察者對象,同時它定義了通知方法notify()。目標類可以是接口,也可以是抽象類或具體類。

????? ● ConcreteSubject(具體目標):具體目標是目標類的子類,通常它包含有經常發生改變的數據,當它的狀態發生改變時,向它的各個觀察者發出通知;同時它還實現了在目標類中定義的抽象業務邏輯方法(如果有的話)。如果無須擴展目標類,則具體目標類可以省略。

????? ● Observer(觀察者):觀察者將對觀察目標的改變做出反應,觀察者一般定義為接口,該接口聲明了更新數據的方法update(),因此又稱為抽象觀察者。

????? ● ConcreteObserver(具體觀察者):在具體觀察者中維護一個指向具體目標對象的引用,它存儲具體觀察者的有關狀態,這些狀態需要和具體目標的狀態保持一致;它實現了在抽象觀察者Observer中定義的update()方法。通常在實現時,可以調用具體目標類的attach()方法將自己添加到目標類的集合中或通過detach()方法將自己從目標類的集合中刪除。
---------------------
作者:Liuwei-Sunny
來源:CSDN
原文:https://blog.csdn.net/lovelion/article/details/7720382
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

?

轉載于:https://www.cnblogs.com/vhyc/p/10078369.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450054.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450054.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450054.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

賭還是不賭 你應該辭職去創業嗎?

【編者按】本文的作者是Amir Khella,他是一位著名的用戶體驗設計師,也是創業顧問和企業家。在過去的三年里,他成功的打造了十幾家公司,其中不少還被大企所收購,比如說Google收購了他的DocVerse,LimeLight N…

Python 深淺copy 和文件操作

深淺copy 1,先看賦值運算。 l1 [1,2,3,[barry,alex]] l2 l1l1[0] 111 print(l1) # [111, 2, 3, [barry, alex]] print(l2) # [111, 2, 3, [barry, alex]]l1[3][0] wusir print(l1) # [111, 2, 3, [wusir, alex]] print(l2) # [111, 2, 3, [wusir, alex]] 對…

這樣安靜下去...

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 我從來就不想要整個世界,我只想這樣安靜下去 ... 放肆我所有癡狂的心愿,無怨無悔 ... 縱我一執燃燒后成灰的稻草…

C# 實現生成帶二維碼的專屬微信公眾號推廣海報

原文:C# 實現生成帶二維碼的專屬微信公眾號推廣海報很多微信公眾號中需要生成推廣海報的功能,粉絲獲得專屬海報后可以分享到朋友圈或發給朋友,為公眾號代言邀請好友即可獲取獎勵的。海報自帶渠道二維碼,粉絲長按二維碼即可關注微信公眾號&…

Android應用開發—PendingIntent:如何判斷兩個PendingIntent對等

摘錄自:PendingIntent詳解 如何判斷兩個PendingIntent對等: 兩個PendingIntent對等是指它們的operation一樣, 且其它們的Intent的action, data, categories, components和flags都一樣。但是它們的Intent的Extra可以不一樣。 主要常量 FLAG_CANCEL_CUR…

最新研究顯示人類智力逐漸下降且變得更愚蠢

請大家去測試智力,看看是否正常水平?真的,智力在下降,在網絡、電子設備和化肥、農藥,轉基因等因素下,人越來越差了。 保存到相冊研究人員稱現代人類將逐漸智力下降,這是因為我們不再需要智力來維…

缺陷的背后---LIMIT M,N 分頁查找

一、問題發現篇 最近組內做了一次典型缺陷分享時,翻閱2018年的缺陷,找到了一個讓我覺得“有料”的bug(別的同事測試發現的),先大致簡單的描述下這個問題: 需要實現的功能:從一個DB庫同步某一段時…

Android應用開發—Intent組件詳解

轉載自:Android中Intent組件詳解 Intent是不同組件之間相互通訊的紐帶,封裝了不同組件之間通訊的條件。 Intent本身是定義為一個類別(Class),一個Intent對象表達一個目的(Goal)或期望(Expectation),敘述其所期望的服務或動作、與…

angularjs 結構的兩種寫法(2)

app.js里面 route.js 本項目中的路由寫法,路由的意思是:對應的跳轉頁面路徑,比如此處當路由是member.user-statisttic時,是會跳轉到url:http://.../user-statisttic.html頁面,然后此頁面對應的ctrl會解析也頁面的參數。…

Linux指令小記(簡明實用)

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1、ls指令,用于列出當前目錄的文件 通過添加-l參數可以使文件以詳情模式列出 通過添加-a參數可以將包含隱藏文件在內的全部文件列出。…

python之glob的用法

目錄 獲取特定擴展名的所有文件 獲取特定目錄下的所有文件 遞歸獲取所有文件 轉義特殊字符 iglob glob 是 Python 中用于文件模式匹配的一個模塊。它使用 Unix shell-style 的通配符來進行匹配,并返回所有匹配的文件路徑列表。 下面是一些 glob 的基本用法&am…

設置Eclipse中的字符集為UTF-8

Eclipse 修改字符集 默認情況下 Eclipse 字符集為 GBK,但現在很多項目采用的是 UTF-8,這是我們就需要設置我們的 Eclipse 開發環境字符集為 UTF-8, 設置步驟如下: 在菜單欄選擇 Window -> Preferences -> General -> Wor…

換位思考的最高境界是換待遇,所以,換位思考就是空話!!!

換位思考的最高境界是換待遇,所以,換位思考就是空話!!! 換位思考是件說難也難,說容易也容易的事情。 如果你肯把你的工資待遇財富地位跟李彥宏互換一下,你就可以輕松理解他到底為什么非要在百度…

一個記錄最近搜索歷史的LRU實現

對于很多有搜索需求的功能,一般需要展示下最近n次的歷史搜索記錄,主要有以下幾個功能點: 最近搜索條目放在最前面,最早的搜索記錄放在最后。只記錄最近n條數據,如果超過n條搜索記錄,刪除搜索時間最久遠的記…

Python數據可視化2018:數據可視化庫為什么這么多?

本文最初發布于Anaconda開發者博客,經原作者授權由InfoQ中文站翻譯并分享。 在奧斯汀舉行的SciPy 2018年特別會議上,大量開源Python可視化工具的代表分享了他們對Python數據可視化未來的展望。我們看到了Matplotlib、Plotly、VisPy等許多庫的更新。我作為…

Oulipo (KMP出現次數)

The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter e. He was a member of the Oulipo group. A quote from the book: Tout avait Pair normal, mais tout s’affirmait faux. Tout avait Fair normal, d’abord, puis su…

從夫妻吵架中看項目管理

從夫妻吵架中看項目管理(很有意思的文章) 首先要說明:和老婆吵架無論原因如何,無論結果如何你都是錯的,老婆永遠是對的。但是我不是神仙,偶爾也要吵架。但是如何讓吵架也發揮作用,增進夫妻感情&…

SpringMVC工作原理

大家好,我是IT修真院深圳分院第十一期學員,一枚正直純潔善良的JAVA程序員。 今天給大家分享一下,修真院官網JAVA任務二的一個知識點:SpringMVC工作原理 1、背景介紹 一:背景介紹 JavaWeb經歷的幾個變化: 1:…

Android應用開發—如何解決handler的警告:Handler Class Should be Static or Leaks Occur

轉自android handler的警告Handler Class Should be Static or Leaks Occur 在使用Handler更新UI的時候,我是這樣寫的: public class SampleActivity extends Activity {private final Handler mLeakyHandler new Handler() {Overridepublic void hand…

從遠程(包括ftp,http等協議)地址獲取文件流信息

URL url new URL("ftp://172.18.251.155:8010/recordsImg/2019-01-28/000008_1548649813267.jpg"); MultipartFile multipartFile new MockMultipartFile(fileName,fileName,"", url.openStream());轉載于:https://www.cnblogs.com/baihaojie/p/10331134…