摘要:在項目開發中,會遇到如下情形我們自己的服務訂閱接收來自消息隊列或者客戶端的事件和請求,基于不同的事件采取對應的行動,這種情況下適合應用派發器模式。
在項目開發中,會遇到如下情形:我們自己的服務訂閱、接收來自消息隊列或者客戶端的事件和請求,基于不同的事件采取對應的行動,這種情況下適合應用派發器模式。
主要模塊XXXEventDispatcher類
核心類,維護事件類型(EventType)到處理器(handler)的映射(存放在ConcurrentHashMap中);這個類在啟動時,會通過XXXEventHandlerInitializer初始化這個map數據結構;在啟動時,需要訂閱或監聽來自消息隊列的事件;當對應的事件到達時,該類的dispatch方法會負責將事件分發到具體的處理器方法中進行處理。
package org.java.learn.java8.dispatcher; import org.springframework.stereotype.Component; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import javax.annotation.PostConstruct; import javax.annotation.Resource; /** * Created by IntelliJ IDEA. * User: duqi * Date: 2016/11/3 * Time: 21:53 */ @Component public class XXXEventDispatcher implements AutoCloseable { @Resource private XXXEventHandlerInitializer initializer; private Maphandlers = new ConcurrentHashMap<>(); @PostConstruct public void init() { //建立綁定關系; initializer.init(); //監聽事件并派發 dispatch("testMsg"); } /** * 將XXX事件注冊到派發器 * * @param xxxEventType * @param xxxEventHandler */ public void bind(XXXEventType xxxEventType, XXXEventHandler xxxEventHandler) { this.handlers.put(xxxEventType, ((eventType, context) -> { try { xxxEventHandler.handle(eventType, context); } catch (Exception e) { //記錄錯誤日志 e.printStackTrace(); } //打印處理器執行日志 })); } /** * 進行事件派發 * @param eventMsg */ private void dispatch(String eventMsg) { //(1) 從eventMsg中獲取eventType; //(2) 根據eventMsg構造eventContext; //(3) 執行具體的處理器方法 } public void close() throws Exception { //釋放資源 } }
XXXEventHandlerInitializer類
這個類包括具體的業務處理方法,在系統初始化的時候,會將這些業務處理方法的方法引用注冊到派發器中。
package org.java.learn.java8.dispatcher; import org.springframework.stereotype.Component; import javax.annotation.Resource; /** * Created by IntelliJ IDEA. * User: duqi * Date: 2016/11/3 * Time: 21:56 */ @Component public class XXXEventHandlerInitializer { @Resource private XXXEventDispatcher dispatcher; public void init() { dispatcher.bind(XXXEventType.event1, this::handleProcess1); dispatcher.bind(XXXEventType.event2, this::handleProcess2); dispatcher.bind(XXXEventType.event3, this::handleProcess3); } private void handleProcess1(XXXEventType eventType, XXXEventContext context) { //事件1的處理邏輯 } private void handleProcess2(XXXEventType eventType, XXXEventContext context) { //事件2的處理邏輯 } private void handleProcess3(XXXEventType eventType, XXXEventContext context) { //事件3的處理邏輯 } }
XXXEventHandler:函數式接口
函數式接口是Java 8 中實現Lambda函數式編程的基礎工具,思想就是要講函數作為參數傳遞。如下圖所示,這些方法引用都是該函數式接口的實現。
代碼如下:
package org.java.learn.java8.dispatcher; /** * Created by IntelliJ IDEA. * User: duqi * Date: 2016/11/3 * Time: 22:03 */ @FunctionalInterface public interface XXXEventHandler { void handle(XXXEventType eventType, XXXEventContext context); }
XXXEventContext類
這個類用于存儲入參和返回值,具體情況可以靈活處理。
package org.java.learn.java8.dispatcher; /** * Created by IntelliJ IDEA. * User: duqi * Date: 2016/11/3 * Time: 22:04 */ public class XXXEventContext { private int param1; private int param2; @Override public String toString() { return "XXXEventContext{" + "param1=" + param1 + ", param2=" + param2 + "}"; } }
XXXEventType枚舉
這個類顯然用于存儲事件類型
package org.java.learn.java8.dispatcher; /** * Created by IntelliJ IDEA. * User: duqi * Date: 2016/11/3 * Time: 22:03 */ public enum XXXEventType { event1, event2, event3 }
總結:在企業級開發中,有很多典型的應用場景和模式,事件派發器只是其中的一種,希望你也能夠根據自己的實際情況加以應用。本文中提到的代碼,參見我的github:LearnJava
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/65283.html
摘要:在方法中處理數據有三不同的角色派發器儲存視圖層我們的組件的主要思想是有一個單一源儲存他們只能通過觸發更新。這些操作負責調用派發器可以訂閱更改并相應地更新自己的數據。與不同不使用派發器而是使用純函數來定義數據變異函數。 本文轉載自:眾成翻譯譯者:iOSDevLog鏈接:http://www.zcfy.cc/article/3812原文:https://www.fullstackreact...
摘要:服務調用過程比較復雜,包含眾多步驟。源碼分析在進行源碼分析之前,我們先來通過一張圖了解服務調用過程。服務調用方式支持同步和異步兩種調用方式,其中異步調用還可細分為有返回值的異步調用和無返回值的異步調用。 注: 本系列文章已捐贈給 Dubbo 社區,你也可以在 Dubbo 官方文檔中閱讀本系列文章。 1. 簡介 在前面的文章中,我們分析了 Dubbo SPI、服務導出與引入、以及集群容錯...
摘要:用于在同一主模塊下的不同子模塊以及不同主模塊之間的通信,支持動態綁定作用域。如果用過的父子組件事件通信以及,對事件管理器應該不會陌生的。而且支持指定作用域,可以遠程調用任意模塊的函數。 上一篇文章介紹了clipboard.js這個工具庫中的第一個依賴select這個工具庫主要完成了對任意DOM元素的復制到粘貼板的功能。這次介紹一下clipboard.js源碼中的第二個依賴的輕型工具庫t...
摘要:使用字符串定義事件類型,容易產生拼寫錯誤并且自動完成不能很好的工作。消息和事件的目標之間并沒有關系。通過命名規范來避免消息被錯誤的訂閱者攔截。細粒度的控制每個監聽器和事件類型。傾向于使用組合而不是繼承。與大多數人使用的不同。 原文鏈接:Comparison between different Observer Pattern implementations 下面的比較只是關于訂閱、發布...
摘要:觀察者模式維護單一事件對應多個依賴該事件的對象關系發布訂閱維護多個事件主題及依賴各事件主題的對象之間的關系觀察者模式是目標對象直接觸發通知全部通知,觀察對象被迫接收通知。 觀察者模式(Observer) 觀察者模式:定義了對象間一種一對多的依賴關系,當目標對象 Subject 的狀態發生改變時,所有依賴它的對象 Observer 都會得到通知。 簡單點:女神有男朋友了,朋友圈曬個圖,甜...
閱讀 2214·2021-11-22 13:54
閱讀 3380·2019-08-29 12:25
閱讀 3444·2019-08-28 18:29
閱讀 3587·2019-08-26 13:40
閱讀 3278·2019-08-26 13:32
閱讀 962·2019-08-26 11:44
閱讀 2234·2019-08-23 17:04
閱讀 2973·2019-08-23 17:02