13_觀察者模式

【觀察者模式】

也叫作發布/訂閱模式,使用較為頻繁。

定義了對象間一種一對多的依賴關系,當一個對象改變狀態時,則所有依賴于它的對象都會得到通知并被自動更新。

觀察者模式由以下幾個角色組成:

* Subject 被觀察者

定義被觀察者必須實現的職責,他必須能夠動態地增阿基、取消觀察者。一般是抽象類或實現類,僅僅完成作為被觀察者必須實現的職責:管理觀察者+通知觀察者。

* ConcreteSubject具體的被觀察者

定義觀察者自己的業務邏輯,同時定義對哪些事件進行通知。

* Observer 觀察者

觀察者接收到消息后,即進行update(更新方法)操作,對接收到的消息進行處理。

* ConcreteObserver具體的觀察者

每個具體觀察者在接受到消息后的處理反應是不一樣的,各個觀察者有自己的處理邏輯。

?

【觀察者模式 例子】

package com.Higgin.Observer;
import java.util.ArrayList;
import java.util.List;/*** 電視觀眾接口 */
interface Viewer{public void feel(String show);
}
/*** 年輕觀眾*/
class YongViewer implements Viewer{@Overridepublic void feel(String show) {System.out.println("年輕人:感覺《"+show+"》很棒!");}
}
/*** 老年觀眾*/
class OldViewer implements Viewer{@Overridepublic void feel(String show) {System.out.println("老年人:感覺《"+show+"》一般!");}
}
/*** 抽象電視節目*/
abstract class TVProgrammer{//用來保存 注冊的電視觀眾對象private List<Viewer> viewers=new ArrayList<Viewer>();//注冊一個電視觀眾public void attach(Viewer v){this.viewers.add(v);}//刪除一個電視觀眾public void detach(Viewer v){this.viewers.remove(v);}//通知所有注冊的電視觀眾public void notifyViewers(String show){for(Viewer v:viewers){v.feel(show);}}
}/*** 具體的娛樂電視節目*/
class HappyTVProgrammer extends TVProgrammer{//切換不同的娛樂節目public void change(String newShow){super.notifyViewers(newShow);   //調用父類的通知方法
    }
}public class TestObserver {public static void main(String[] args) {Viewer yong=new YongViewer();  //一個年輕觀眾Viewer old=new OldViewer();    //一個老年觀眾HappyTVProgrammer tvp=new HappyTVProgrammer(); //娛樂電視節目tvp.attach(yong);  //注冊一個年輕人tvp.attach(old);   //注冊一個老年人tvp.notifyViewers("極限挑戰");System.out.println("=============================");tvp.detach(old);  //老人不愛看,解除tvp.change("奔跑吧,兄弟!");}
}

【運行結果】

?

【觀察者模式 優點】

* 觀察者和被觀察者之間是抽象耦合的

不管是增加觀察者還是被觀察者都非常容易,而且在java中已經實現了抽象層級的定義,在系統擴展方面應用良好。

* 建立了一套觸發機制

根據單一職責原則,每個類的職責是單一的,如A事件觸發B事件,B事件觸發C事件...這是一個觸發機制,形成一個觸發鏈,觀察者模式可以實現這里的鏈條形式。

【觀察者模式 缺點】

要考慮開發效率和運行效率的問題,一個被觀察者,多個觀察者,開發和調試較為復雜,而且在JAVA中消息通知默認是順序執行的,一個觀察者卡殼,會影響整體的執行效率。這種情況一般會采用異步的方式。

【觀察者模式 使用場景】

* 關聯行為場景,注意關聯行為是可拆分的,而不是“組合”關系。

* 事件多級觸發場景。

* 跨系統的消息交換場景。

?

轉載于:https://www.cnblogs.com/HigginCui/p/6225729.html

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

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

相關文章

【python】內建異常類的層次

內建異常類的層次 BaseException-- SystemExit-- KeyboardInterrupt-- GeneratorExit-- Exception-- StopIteration-- StopAsyncIteration-- ArithmeticError| -- FloatingPointError| -- OverflowError| -- ZeroDivisionError-- AssertionError-- AttributeError-- …

《黑客秘笈——滲透測試實用指南》—第2章2.3節 外部或內部的主動式信息收集...

本節書摘來自異步社區《黑客秘笈——滲透測試實用指南》一書中的第2章2.3節 外部或內部的主動式信息收集&#xff0c;作者【美】Peter Kim&#xff08;彼得 基姆&#xff09;,更多章節內容可以訪問云棲社區“異步社區”公眾號查看。 2.3 外部或內部的主動式信息收集黑客秘笈——…

Storm集群的安裝及簡單使用

目錄前言&#xff1a;1、集群部署的基本流程2、Storm常用操作命令&#xff08;了解&#xff09;3、Storm集群的進程及日志熟悉&#xff08;知道對應的日志的位置出了問題知道去哪找原因&#xff09;4、Storm源碼目錄分析&#xff08;重要&#xff09;總結&#xff1a; 目錄 前…

【python】錯誤、異常和文件---復習筆記

錯誤、異常和文件 1. 異常處理 錯誤指的是代碼有語法問題&#xff0c;無法解釋運行&#xff0c;必須改正后才能運行 如果代碼沒有語法問題&#xff0c;可以運行&#xff0c;但會出運行時的錯誤&#xff0c;例如除零錯誤&#xff0c;下標越界等問題&#xff0c;這種在運行期間…

關于使用百度ueditor時的一些問題

本來這些問題直接在百度貼吧里回答不就完事了,可是好死不死的,百度貼吧里老出現 未知錯誤&#xff0c;錯誤號&#xff1a;230274 看來還是算了,自己做一個隨筆記錄一下好了 關于我們獲取里面的內容時,老是會有一個<p>來包著,而且還老是多出來一個<br/> 這邊是這么處…

Storm的通信機制

目錄前言&#xff1a;1、Worker進程間通信原理2、Worker進程間技術(Netty、ZeroMQ)3、Worker 內部通信技術(Disruptor)總結&#xff1a; 目錄 前言&#xff1a; 這篇文章&#xff0c;博客主要介紹下Storm中Worker進程間和進程內部通信的原理和技術。整篇內容僅供了解&#x…

《Windows PowerShell實戰指南(第2版)》——1.4 搭建自己的實驗環境

本節書摘來自異步社區《Windows PowerShell實戰指南&#xff08;第2版&#xff09;》一書中的第1章&#xff0c;第1.4節&#xff0c;作者&#xff1a;【美】Don Jones&#xff08;道瓊斯&#xff09; , Jeffery Hicks&#xff08;杰弗瑞希克斯&#xff09;著&#xff0c;更多章…

已解決]求問not 1 or 0 and 1 or 3 and 4 or 5 and 6 or 7 and 8 and 9為什么不等于0呢???

not 1 or 0 and 1 or 3 and 4 or 5 and 6 or 7 and 8 and 9 ----> (not 1&#xff09;)or (0 and 1) or (3 and 4) or (5 and 6) or (7 and 8 and 9) ----> 0 or 0 or 4 or 6 or 9 ----> 0 or 4 or 6 or 9 ----> 4 or 6 or 9 4

C#外圍工具資源

1、MATH.NET數學庫:可以用于 矩陣計算方程求根插值擬合。。。2、轉載于:https://www.cnblogs.com/liq07lzucn/p/6227443.html

Storm程序的并發機制原理總結

文章目錄目錄前言&#xff1a;1、概念2、配置并行度總結&#xff1a;目錄 前言&#xff1a; 為了在以后的實踐中提高Storm程序執行的效率&#xff0c;我們還是有必要了解下對應的Storm程序的并發機制。&#xff08;哈哈&#xff0c;雖然以博主小菜鳥的水平還沒有接觸到這種提…

《無線網絡:理解和應對互聯網環境下網絡互連所帶來的挑戰》——第2章 無線生態系統 2.1無線標準化過程...

本節書摘來自華章出版社《無線網絡&#xff1a;理解和應對互聯網環境下網絡互連所帶來的挑戰》一書中的第2章&#xff0c;第2.1節&#xff0c;作者&#xff1a;&#xff08;美&#xff09;杰克L.伯班克&#xff08;Jack L. Burbank&#xff09;等著&#xff0c;更多章節內容可以…

Flask模板01

模板 在前面的示例中&#xff0c;視圖函數的主要作用是生成請求的響應&#xff0c;這是最簡單的請求。實際上&#xff0c;視圖函數有兩個作用&#xff1a;處理業務邏輯和返回響應內容。在大型應用中&#xff0c;把業務邏輯和表現內容放在一起&#xff0c;會增加代碼的復雜度和…

★數學上最大的數是多少?

數學上最大的數是多少&#xff1f; 怪羅科普 收藏(282)| 閱讀(117678)人類已經使用數長達千年之久。普遍認為&#xff0c;數的概念最先源于史前人類開始使用手指進行計數。這最終演變成符號語言&#xff0c;然后在沙子、墻壁和木頭等物體上作標記。 我們已經向前發展了一大步&…

Flask模板02

3.4 控制語句 常用的幾種控制語句&#xff1a; 模板中的if控制語句 app.route(/user) def user():user dongGereturn render_template(user.html,useruser)<html><head>{% if user %}<title> hello {{user}} </title>{% else %}<title> welc…

Storm任務提交過程及目錄樹介紹

目錄前言&#xff1a;1、Storm 任務提交的過程2、Storm相關的目錄樹總結&#xff1a; 目錄 前言&#xff1a; 對于任何一個組件來說&#xff0c;了解它相關的任務提交的過程是非常有必要的&#xff08;畢竟生產中遇到一些Bug時&#xff0c;你如果知道內部執行的過程&#xf…

《Adobe InDesign CS6中文版經典教程》—第1課1.5節修改文檔的縮放比例

本節書摘來自異步社區《Adobe InDesign CS6中文版經典教程》一書中的第1課1.5節修改文檔的縮放比例&#xff0c;作者【美】Adobe公司,更多章節內容可以訪問云棲社區“異步社區”公眾號查看。 1.5 修改文檔的縮放比例Adobe InDesign CS6中文版經典教程InDesign中的控件讓用戶能…

隨機生成一定范圍的隨機數

function randomNum(min,max) { return Math.ceil(Math.random()*(max-min)min); } min,max最小最大范圍數字。轉載于:https://www.cnblogs.com/kingzlz/p/6229586.html

【python】Flask視圖

2.1 從 Hello World 開始 Flask程序運行過程&#xff1a; 所有Flask程序必須有一個程序實例。 Flask調用視圖函數后&#xff0c;會將視圖函數的返回值作為響應的內容&#xff0c;返回給客戶端。一般情況下&#xff0c;響應內容主要是字符串和狀態碼。 當客戶端想要獲取資源…

大數據之Kafka入門簡介

目錄前言&#xff1a;1、Kafka是什么2、JMS是什么3、Kafka核心組件&#xff08;重點&#xff09;總結&#xff1a; 目錄 前言&#xff1a; 作為流式計算中的一個組件&#xff0c;對于它的組成以及運行的原理&#xff0c;學習者也需要相關的了解。以下主要簡單介紹了kafka是什…

oracle的安裝與plsql的環境配置

1&#xff0c;首先得有oracle的安裝包和plsql的安裝包&#xff0c;安裝包地址可見百度云 http://pan.baidu.com/s/1miTqhmg 2.解壓下來進入0817賬套&#xff0c;找到set.exe文件&#xff0c;雙擊安裝即可 注意的是安裝的時候有兩個目錄是要自己創建的&#xff0c;否則安裝不成功…