精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

監聽器模式和觀察者模式的關系,寫點你不知道的

安全 應用安全
通過本篇文章我們知道,監聽器模式的本質就是觀察者模式,先將回調函數注冊到被觀察對象,當被觀察對象發生變化時,通過回調函數告知觀察者/監聽者。而Spring中事件管理也是基于觀察者模式實現的,算是一個比較經典的案例。

[[404308]]

本文轉載自微信公眾號「程序新視界」,作者二師兄。轉載本文請聯系程序新視界公眾號。

前言

無論大家在實踐中是否自己實現過觀察者模式或監聽器模式,但肯定間接使用過。比如Spring的事件機制,大多數人肯定都用過,只是沒留意而已。

今天這篇文章主要圍繞觀察者模式、監聽器模式,以及它們之間的關系展開。不僅用實例介紹它們的使用,而且也會聊一聊Spring事件機制對觀察者模式的實踐。

監聽器模式和觀察者模式怎么看起來是一樣的?

先聊聊設計模式

為什么要使用監聽模式,直接調用不好嗎?這我們就要說說設計模式的好處了。設計模式(Design pattern)是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。同時,采用設計模式之后,代碼能夠達到低耦合、低依賴的效果。

也就是說,即便不用設計模式,直接硬編碼也能實現。但如果考慮到代碼的耦合性、依賴性、擴展性等問題,設計模式便是更好的選擇。比如觀察者模式就能達到解耦、異步等效果。

觀察者模式的定義

觀察者模式定義了對象之間的一對多依賴,即一個主題對應多個觀察者。當一個主題對象改變狀態時,它的所有依賴者(觀察者)都會收到通知并自動更新。比如用戶訂閱某個訂閱號或公眾號,當發新消息時,會發送給所有訂閱者。

觀察者模式解決的是對象和對象之間的依賴關系。當多個對象依賴一個對象的關系時,一個主題對象狀態改變,需要通知所有觀察者對象。

監聽器模式并不是一個新的設計模式,它是觀察者模式在特定場景下的一種改造和應用。通常,觀察者模式的主題在通知觀察者時,通知中不包含任何信息。如果這個過程中攜帶了一些其他信息,那么主題本身就成為了事件源,而攜帶信息的封裝類就成為了事件。此時的觀察者模式,也就升級為監聽器了。監聽器模式是觀察者模式的另一種形態。

觀察者模式實例

先來看看觀察者模式的代碼實現,可以直接使用JDK自帶的Observer,也可以自定義對應的API。單從JDK自帶觀察者模式的API,也可以看出該設計模式的分量(雖然在Java被廢棄了)。

我們這里采用自定義相關類,主要包括主題和觀察者兩種對象。

首先定義一個主題對應的接口Subject:

  1. public interface Subject { 
  2.  
  3.     /** 
  4.      * 注冊定義 
  5.      */ 
  6.     void registerObserver(Observer observer); 
  7.  
  8.     /** 
  9.      * 發送通知 
  10.      */ 
  11.     void notifyObservers(Object msg); 
  12.  

主題接口中定義了兩個方法一個用來注冊觀察者,一個用來發送通知。定義這個主題的具體實現類ConcreteSubject:

  1. public class ConcreteSubject implements Subject { 
  2.  
  3.     /** 
  4.      * 觀察者集合 
  5.      */ 
  6.     private List<Observer> observers = new ArrayList<>(); 
  7.  
  8.     @Override 
  9.     public void registerObserver(Observer observer) { 
  10.         // 添加訂閱關系 
  11.         observers.add(observer); 
  12.     } 
  13.  
  14.     @Override 
  15.     public void notifyObservers(Object msg) { 
  16.         // 通知訂閱者 
  17.         for (Observer observer : observers) { 
  18.             observer.update(msg); 
  19.         } 
  20.     } 

實現類中存儲了,觀察者的集合,這樣就實現了主題和觀察者之間一對多的關系。

創建一個觀察者接口Observer,方便管理:

  1. public interface Observer { 
  2.     // 處理業務邏輯 
  3.     void update(Object msg); 

定義觀察者接口的具體實現類ConcreteObserver:

  1. public class ConcreteObserver implements Observer { 
  2.  
  3.     @Override 
  4.     public void update(Object msg) { 
  5.         // 業務邏輯實現 
  6.         System.out.println("ConcreteObserver 接收到主題的消息: " + msg); 
  7.     } 

在實現類中,打印一行消息。當然,在實踐的過程中,這個實現類可以通過匿名類的形式創建,這樣就具體的匿名類就在registerObserver時定義了。

下面來測試一下:

  1. public class ConcreteObserver implements Observer { 
  2.  
  3.     @Override 
  4.     public void update(Object msg) { 
  5.         // 業務邏輯實現 
  6.         System.out.println("ConcreteObserver 接收到主題的消息: " + msg); 
  7.     } 

執行程序,打印結果:

  1. ConcreteObserver 接收到主題的消息: 來自Subject的消息 

說明可以正常接收到主題發布的消息。

在上面的實現中,可以看出已經達到了解耦合的效果,同時減少了依賴關系。每個觀察者根本不需要知道發布者處理了什么業務邏輯,也不依賴于發布者的業務模型,只關心自己的邏輯處理即可。

監聽模式實例

監聽器模式通常包含三個角色:事件源、事件對象、事件監聽器。如果觀察者模式中的類名和方法對照改一下,并不改變業務邏輯,我們來看看是啥效果。

比如,將Observer改名為Listener,將其update方法改為onClick();將Subject的實現類ConcreteSubject改名為ListenerSupport,將registerObserver方法更名為addListener……

定義一個事件對象Event,用來傳遞事件信息:

  1. public class Event { 
  2.     private String data; 
  3.     private String type; 
  4.  
  5.     Event(String data, String type) { 
  6.         this.data = data; 
  7.         this.type = type; 
  8.     } 
  9.     // 省略getter/setter 

原來主題的訂閱對象Observer改名為Listener之后,成為監聽器:

  1. public interface Listener { 
  2.     void onClick(Event event); 

為監聽器提供一個實現類,當然在實踐中也可以采用匿名類創建的方式:

  1. public class ListenerA implements Listener { 
  2.  
  3.     @Override 
  4.     public void onClick(Event event) { 
  5.         System.out.println("觸發事件,type:" + event.getType() + ",data:" + event.getData()); 
  6.     } 

原來的主題ConcreteSubject對照ListenerSupport成為事件管理器:

  1. public class ListenerSupport { 
  2.  
  3.     private List<Listener> listeners = new ArrayList<>(); 
  4.  
  5.     public void addListener(Listener listener) { 
  6.         listeners.add(listener); 
  7.     } 
  8.  
  9.     public void triggerEvent(Event event) { 
  10.         for (Listener listener : listeners) { 
  11.             listener.onClick(event); 
  12.         } 
  13.     } 

對應的測試代碼:

  1. public class EventTest { 
  2.  
  3.     public static void main(String[] args) { 
  4.         Listener listener = new ListenerA(); 
  5.         ListenerSupport listenerSupport = new ListenerSupport(); 
  6.         listenerSupport.addListener(listener); 
  7.         listenerSupport.triggerEvent(new Event("dataA""typeA")); 
  8.     } 

執行程序,打印信息如下:

  1. 觸發事件,type:typeA,data:dataA 

通過上面的對照代碼,我們可以看出,即便業務邏輯不變,經過重命名的觀察者模式已經變為監聽器模式了。而它們的對照關系是:事件源對照ConcreteSubject(主題)、事件對象對照update方法的Object、事件監聽器對照ConcreteObserver(訂閱者)。這也再次證明了所說的“監聽器模式是觀察者模式的另一種形態”。

觀察者模式和監聽器模式對比

用一張圖,來比較觀察者模式和監聽器模式的聯系和區別:

通過對比可以發監聽器模式的優勢是:在很多場景中,通知中附帶了一些必不可少的其他信息,而事件Event可以對這些信息進行封裝,使它本身擁有了多態的特性。每個事件對象就可以包含不同的信息。從這個層面來說,事件監聽器模式是對觀察者模式進行了進一步的抽象。

Spring中的最佳實踐

觀察者模式的經典應用算是Spring事件驅動模型了,它便是基于觀察者模式實現的,同時也是項目中最常見的事件監聽器。

Spring中觀察者模式包含四個角色:事件、事件監聽器、事件源、事件管理。

事件:ApplicationEvent是所有事件對象的父類。ApplicationEvent繼承自jdk的EventObject,所有的事件都需要繼承ApplicationEvent,并且通過source得到事件源。Spring 提供了很多內置事件,比如:ContextRefreshedEvent、ContextStartedEvent、ContextStoppedEvent、ContextClosedEvent、RequestHandledEvent。

事件監聽器:ApplicationListener,也就是觀察者,繼承自jdk的EventListener,該類中只有一個方法onApplicationEvent,當監聽的事件發生后該方法會被執行。

事件源:ApplicationContext,ApplicationContext是Spring的核心容器,在事件監聽中ApplicationContext可以作為事件的發布者,也就是事件源。因為ApplicationContext繼承自ApplicationEventPublisher。在ApplicationEventPublisher中定義了事件發布的方法:publishEvent(Object event)。

事件管理:ApplicationEventMulticaster,用于事件監聽器的注冊和事件的廣播。監聽器的注冊就是通過它來實現的,它的作用是把Applicationcontext發布的Event廣播給它的監聽器列表。

小結

 

通過本篇文章我們知道,監聽器模式的本質就是觀察者模式,先將回調函數注冊到被觀察對象,當被觀察對象發生變化時,通過回調函數告知觀察者/監聽者。而Spring中事件管理也是基于觀察者模式實現的,算是一個比較經典的案例。

 

責任編輯:武曉燕 來源: 程序新視界
相關推薦

2022-01-29 22:12:35

前端模式觀察者

2020-10-26 08:45:39

觀察者模式

2021-09-06 10:04:47

觀察者模式應用

2021-07-08 11:28:43

觀察者模式設計

2013-11-26 17:09:57

Android設計模式

2011-04-29 09:22:22

2024-06-04 13:11:52

Python行為設計模式開發

2021-07-08 07:52:49

容器監聽器Event

2024-12-03 09:34:35

觀察者模 式編程Javav

2015-11-25 11:10:45

Javascript設計觀察

2024-02-18 12:36:09

2022-05-09 10:50:13

觀察者模式設計模式

2012-08-27 10:52:20

.NET架構觀察者模式

2021-03-29 07:14:28

Spring觀察者模式

2009-03-30 09:39:04

觀察者思想換位設計模式

2020-06-12 09:20:33

前端Blob字符串

2020-07-28 08:26:34

WebSocket瀏覽器

2022-11-15 07:35:50

Spring事件觀察者模式

2021-10-22 09:41:26

橋接模式設計

2021-01-25 05:38:04

設計原理VueSubject
點贊
收藏

51CTO技術棧公眾號

亚洲第一天堂av| 一区二区三区免费观看| 国产欧美一区二区三区视频| www.av免费| 97久久亚洲| 色诱视频网站一区| 欧美一级黄色录像片| 欧美天堂在线视频| 日日骚欧美日韩| 欧美日韩爱爱视频| 久久美女免费视频| 蜜桃在线一区| 色狠狠色狠狠综合| 99久久免费观看| h视频在线免费| 波多野结衣中文一区| 国产欧美日韩丝袜精品一区| 日本少妇性生活| 91中文字幕精品永久在线| 亚洲精品av在线| 国产不卡的av| 91p九色成人| 精品久久久久久久久久ntr影视| 亚洲在线不卡| 天天干天天摸天天操| 极品少妇xxxx精品少妇| 欧美亚洲成人免费| 精品无码av在线| 国产精品99一区二区三| 亚洲欧洲日韩国产| 国产精品亚洲一区二区无码| 色狠狠一区二区三区| 欧美午夜片欧美片在线观看| 久久av综合网| av毛片在线看| 最新国产の精品合集bt伙计| 日本免费高清不卡| 天天综合网在线观看| 国产精品456| 成人激情视频在线观看| 国产精品无码粉嫩小泬| 国产毛片一区| 97婷婷涩涩精品一区| 印度午夜性春猛xxx交| 欧美激情成人| 日韩在线观看免费av| 变态另类ts人妖一区二区| 欧美三级电影在线| 亚洲激情中文字幕| 免费日本黄色网址| 国产精品香蕉| 亚洲第一区在线观看| 69xxx免费视频| 99re91这里只有精品| 日韩亚洲欧美在线| 日韩欧美中文在线视频| 亚洲国产精选| 91精品国产综合久久久久久漫画 | 91精品国产91久久久久青草| 91中文字幕在线播放| 狠狠色综合色综合网络| 91精品免费久久久久久久久| 国产一区二区三区三州| 国产一区欧美一区| 91久久国产自产拍夜夜嗨| 精品人妻av一区二区三区| 国产不卡视频在线播放| 高清不卡日本v二区在线| 亚洲成人av综合| 91在线国产观看| 欧美久久久久久| 福利片在线看| 亚洲丝袜另类动漫二区| 妺妺窝人体色www看人体| 678在线观看视频| 亚洲成va人在线观看| 哪个网站能看毛片| 国产a亚洲精品| 欧美一区在线视频| 久久久久久婷婷| 中文字幕av一区二区三区人| 中日韩美女免费视频网站在线观看| 小泽玛利亚一区| 亚洲人妖在线| 国产精品视频资源| 99久久婷婷国产一区二区三区| 顶级嫩模精品视频在线看| 精品国产一区二区三区麻豆免费观看完整版 | 免费成人美女在线观看.| 91久久精品国产91久久性色| 亚洲AV无码成人片在线观看| 91丨porny丨国产| 亚洲精品一区二区三区樱花| 在线观看免费视频你懂的| 欧美日韩一区二区免费在线观看| 爱情岛论坛vip永久入口| 欧美a在线观看| 亚洲免费电影一区| 亚洲综合网在线| 免费国产自线拍一欧美视频| 91理论片午午论夜理片久久| 视频一区 中文字幕| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 成人日韩在线观看| 欧美一区二区三区在线观看视频 | 国产视频第一页| 97久久久精品综合88久久| 亚洲三区在线| 少妇视频在线观看| 欧美一区二区三区影视| 扒开jk护士狂揉免费| 欧美jjzz| 国产精品一区二区在线| 全色精品综合影院| 亚洲一区二区在线免费看| 久久久精品高清| 欧美日本成人| 欧美精品成人91久久久久久久| 中文在线免费观看| 91理论电影在线观看| 男人c女人视频| 色999久久久精品人人澡69| 亚洲人成电影网站色…| a v视频在线观看| 国产精品18久久久久久久久久久久 | 最新国产成人在线观看| 欧美日韩亚洲第一| 欧美人妖在线观看| 国产69精品久久久| 精品国产免费无码久久久| 国产精品久久国产精麻豆99网站| 超碰97人人射妻| 好吊妞视频这里有精品| 粗暴蹂躏中文一区二区三区| 在线播放亚洲精品| 国产精品午夜免费| 黄色一级二级三级| 综合色就爱涩涩涩综合婷婷| 97色在线视频| 日本黄色大片视频| 亚洲午夜久久久久中文字幕久| 国产chinesehd精品露脸| 久久精品青草| 成人免费高清完整版在线观看| 黄色大片在线免费观看| 黑人精品xxx一区一二区| 日本黄色动态图| 亚洲免费黄色| 国产一区二区三区高清视频| av在线小说| 日韩第一页在线| 久久久精品免费看| 91在线观看污| 欧美xxxxx在线视频| 希岛爱理av免费一区二区| 欧美在线精品免播放器视频| 四虎精品成人影院观看地址| 色诱亚洲精品久久久久久| 特级西西www444人体聚色 | а 天堂 在线| 伊人久久大香线| 成人片在线免费看| 高清毛片在线观看| 亚洲男人天堂手机在线| 精品国产xxx| 国产精品欧美极品| www.污网站| 黄色日韩在线| 久久国产精品-国产精品| 成人性生活av| www.日本久久久久com.| av手机免费看| 无码av中文一区二区三区桃花岛| 久久久久久九九九九九| 老司机精品视频导航| 久久精品在线免费视频| а√中文在线天堂精品| 青青草成人在线| 95在线视频| 欧美变态tickle挠乳网站| 一级片中文字幕| 中文av一区二区| 久久久久亚洲av无码网站| 国产精品资源| 亚洲av综合色区| 神马午夜久久| 成人网欧美在线视频| 91超碰国产在线| 自拍偷拍亚洲一区| 亚洲高清视频网站| 91久久精品国产91性色tv| 日韩影院一区二区| 久久综合九色综合97_久久久| 中文字幕22页| 亚洲视频二区| 福利网在线观看| 奇米色欧美一区二区三区| av一区二区三区四区电影| 欧美成人黑人| 色综合视频网站| 成人不用播放器| 亚洲福利在线视频| 91麻豆国产在线| 欧美性极品xxxx做受| 亚洲波多野结衣| 久久久久久久久久久久久久久99 | 日韩欧美中文在线观看| 国产成人精品久久久| 欧美videossex| 色偷偷综合社区| 天堂中文在线视频| 日韩欧美在线影院| 中文字幕永久免费视频| 大荫蒂欧美视频另类xxxx| 成人18视频免费69| 久久麻豆一区二区| 人妻 丝袜美腿 中文字幕| 久久精品国产网站| 国产成人a亚洲精v品无码| 欧美午夜在线| 正在播放亚洲| 欧美综合另类| 秋霞久久久久久一区二区| 国产精品午夜av| 99久久精品久久久久久ai换脸| 99精品在免费线偷拍| 欧美在线一区二区视频| 久久青青色综合| 欧美成人在线网站| 日本高清在线观看wwwww色| 国产一区二区美女视频| 视频一区二区在线播放| 亚洲第一视频在线观看| 人妻精品无码一区二区| 日韩片之四级片| a毛片在线免费观看| 欧美久久一区二区| 成人黄色三级视频| 91电影在线观看| 亚洲天堂五月天| 欧美视频在线免费| 国产性猛交╳xxx乱大交| 亚洲一区二区不卡免费| 久久精品欧美一区二区| 亚洲一级片在线观看| 精品视频久久久久| 亚洲一区在线看| 动漫精品一区一码二码三码四码| 一区二区三区高清| 欧美色图亚洲视频| 亚洲午夜私人影院| 中日韩精品视频在线观看| 性欧美疯狂xxxxbbbb| 男女啊啊啊视频| 欧美性生交大片免费| 成人免费视频国产免费| 欧美日韩国产首页| 国产精品视频一二区| 欧美一卡2卡三卡4卡5免费| 国内精品久久久久久久久久久 | 欧美日韩免费观看一区=区三区| 国产一级片91| 亚洲精品日韩久久| 免费在线激情视频| 免费在线看成人av| 999久久久精品视频| 国产成人在线视频网址| japanese在线观看| 国产女同性恋一区二区| 性爱在线免费视频| 亚洲免费高清视频在线| 精品在线视频免费| 91极品美女在线| 一级黄色录像大片| 精品久久人人做人人爱| 深夜福利在线观看直播| 亚洲亚裔videos黑人hd| 老司机在线永久免费观看| 欧美日韩福利在线观看| 欧美aaaaa性bbbbb小妇| 91精品久久久久久久久不口人| 日韩08精品| 欧美久久久久久久| 亚洲国产日韩欧美在线| 免费看黄在线看| 青青青伊人色综合久久| 免费国偷自产拍精品视频| 99re热这里只有精品免费视频| 日韩一卡二卡在线观看| 亚洲妇女屁股眼交7| 少妇一级淫片日本| 日韩精品一区在线| 久久这里精品| 久国内精品在线| 国产精品高清乱码在线观看| 亚洲一区二区三区四区视频| 女厕嘘嘘一区二区在线播放 | 日韩精品久久久毛片一区二区| 一区二区在线影院| 亚洲少妇第一页| 成人免费看的视频| 亚洲精品自拍视频在线观看| 精品久久久中文| 国产农村妇女毛片精品| 亚洲欧美综合精品久久成人| 直接在线观看的三级网址| 国产成人精品久久| 青草久久视频| 成人国产在线看| 另类的小说在线视频另类成人小视频在线 | 精品国产欧美日韩一区二区三区| 国产精品大全| 1024精品久久久久久久久| 亚洲精品中文字幕无码蜜桃| 国产91精品欧美| av在线免费播放网址| 日韩欧中文字幕| 午夜精品久久久久久久爽 | 国产夫妻在线播放| 亚洲精品日产aⅴ| 成人激情视频| 久久精品99国产| 成人av在线一区二区三区| 国产成人av免费在线观看| 欧美亚洲综合久久| 日韩精品福利| 91干在线观看| 国产精品jk白丝蜜臀av小说| 日本精品福利视频| 精品无人码麻豆乱码1区2区| 国产aaaaaaaaa| 欧美在线|欧美| 国产福利在线观看| 国产99久久精品一区二区| 亚州国产精品| jizzjizz国产精品喷水| av不卡在线播放| 国产无遮挡又黄又爽又色| 日韩欧美aaaaaa| 羞羞的视频在线观看| 91视频最新| 午夜久久tv| 亚洲成年人在线观看| 亚洲一区二区三区自拍| 国产91久久久| 欧美激情视频播放| 影音先锋欧美激情| 性一交一乱一伧国产女士spa| 成人av在线影院| 亚洲va在线观看| 一区二区三区回区在观看免费视频| 日韩av超清在线观看| 日本一区二区三区四区在线观看| 日韩精品每日更新| 在线观看亚洲大片短视频| 欧美亚洲国产怡红院影院| 无遮挡的视频在线观看| 国产在线视频一区| 女人色偷偷aa久久天堂| youjizz.com日本| 午夜精品一区二区三区电影天堂 | 99久久人爽人人添人人澡| 日韩精品在线中文字幕| av网站免费线看精品| 一级做a爰片久久毛片| 色噜噜久久综合伊人一本| 99综合99| 国产精品又粗又长| 91小视频在线免费看| 五月天中文字幕| 久久天天躁狠狠躁老女人| 国产精品宾馆| 国产成人无码一二三区视频| 国产精品系列在线| 亚洲乱码精品久久久久..| 97欧美精品一区二区三区| 国产亚洲欧美日韩在线观看一区二区 | 蜜臀av一区二区三区| 加勒比婷婷色综合久久| 亚洲国产成人av在线| 四虎成人在线| 欧美国产视频一区| 国产欧美日韩在线观看| 国内精品国产成人国产三级| 欧美一级大片在线观看| 国产精品成人av| 精品一区二区视频在线观看| 欧美日韩中文字幕一区| 好吊日av在线| 四虎一区二区| 成人avav在线| 一本色道久久综合熟妇| 4438全国亚洲精品在线观看视频| 人人狠狠综合久久亚洲婷婷| 无码人妻一区二区三区一| 欧美性受xxxx黑人xyx| 少女频道在线观看高清 | 日本丰满少妇一区二区三区| 大片免费在线观看| 欧美日韩另类综合|