摘要:在項(xiàng)目開發(fā)中,會(huì)遇到如下情形我們自己的服務(wù)訂閱接收來自消息隊(duì)列或者客戶端的事件和請(qǐng)求,基于不同的事件采取對(duì)應(yīng)的行動(dòng),這種情況下適合應(yīng)用派發(fā)器模式。
在項(xiàng)目開發(fā)中,會(huì)遇到如下情形:我們自己的服務(wù)訂閱、接收來自消息隊(duì)列或者客戶端的事件和請(qǐng)求,基于不同的事件采取對(duì)應(yīng)的行動(dòng),這種情況下適合應(yīng)用派發(fā)器模式。
主要模塊XXXEventDispatcher類
核心類,維護(hù)事件類型(EventType)到處理器(handler)的映射(存放在ConcurrentHashMap中);這個(gè)類在啟動(dòng)時(shí),會(huì)通過XXXEventHandlerInitializer初始化這個(gè)map數(shù)據(jù)結(jié)構(gòu);在啟動(dòng)時(shí),需要訂閱或監(jiān)聽來自消息隊(duì)列的事件;當(dāng)對(duì)應(yīng)的事件到達(dá)時(shí),該類的dispatch方法會(huì)負(fù)責(zé)將事件分發(fā)到具體的處理器方法中進(jìn)行處理。
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() { //建立綁定關(guān)系; initializer.init(); //監(jiān)聽事件并派發(fā) dispatch("testMsg"); } /** * 將XXX事件注冊(cè)到派發(fā)器 * * @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) { //記錄錯(cuò)誤日志 e.printStackTrace(); } //打印處理器執(zhí)行日志 })); } /** * 進(jìn)行事件派發(fā) * @param eventMsg */ private void dispatch(String eventMsg) { //(1) 從eventMsg中獲取eventType; //(2) 根據(jù)eventMsg構(gòu)造eventContext; //(3) 執(zhí)行具體的處理器方法 } public void close() throws Exception { //釋放資源 } }
XXXEventHandlerInitializer類
這個(gè)類包括具體的業(yè)務(wù)處理方法,在系統(tǒng)初始化的時(shí)候,會(huì)將這些業(yè)務(wù)處理方法的方法引用注冊(cè)到派發(fā)器中。
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:函數(shù)式接口
函數(shù)式接口是Java 8 中實(shí)現(xiàn)Lambda函數(shù)式編程的基礎(chǔ)工具,思想就是要講函數(shù)作為參數(shù)傳遞。如下圖所示,這些方法引用都是該函數(shù)式接口的實(shí)現(xiàn)。
代碼如下:
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類
這個(gè)類用于存儲(chǔ)入?yún)⒑头祷刂?,具體情況可以靈活處理。
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枚舉
這個(gè)類顯然用于存儲(chǔ)事件類型
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 }
總結(jié):在企業(yè)級(jí)開發(fā)中,有很多典型的應(yīng)用場(chǎng)景和模式,事件派發(fā)器只是其中的一種,希望你也能夠根據(jù)自己的實(shí)際情況加以應(yīng)用。本文中提到的代碼,參見我的github:LearnJava
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/65283.html
摘要:在方法中處理數(shù)據(jù)有三不同的角色派發(fā)器儲(chǔ)存視圖層我們的組件的主要思想是有一個(gè)單一源儲(chǔ)存他們只能通過觸發(fā)更新。這些操作負(fù)責(zé)調(diào)用派發(fā)器可以訂閱更改并相應(yīng)地更新自己的數(shù)據(jù)。與不同不使用派發(fā)器而是使用純函數(shù)來定義數(shù)據(jù)變異函數(shù)。 本文轉(zhuǎn)載自:眾成翻譯譯者:iOSDevLog鏈接:http://www.zcfy.cc/article/3812原文:https://www.fullstackreact...
摘要:服務(wù)調(diào)用過程比較復(fù)雜,包含眾多步驟。源碼分析在進(jìn)行源碼分析之前,我們先來通過一張圖了解服務(wù)調(diào)用過程。服務(wù)調(diào)用方式支持同步和異步兩種調(diào)用方式,其中異步調(diào)用還可細(xì)分為有返回值的異步調(diào)用和無(wú)返回值的異步調(diào)用。 注: 本系列文章已捐贈(zèng)給 Dubbo 社區(qū),你也可以在 Dubbo 官方文檔中閱讀本系列文章。 1. 簡(jiǎn)介 在前面的文章中,我們分析了 Dubbo SPI、服務(wù)導(dǎo)出與引入、以及集群容錯(cuò)...
摘要:用于在同一主模塊下的不同子模塊以及不同主模塊之間的通信,支持動(dòng)態(tài)綁定作用域。如果用過的父子組件事件通信以及,對(duì)事件管理器應(yīng)該不會(huì)陌生的。而且支持指定作用域,可以遠(yuǎn)程調(diào)用任意模塊的函數(shù)。 上一篇文章介紹了clipboard.js這個(gè)工具庫(kù)中的第一個(gè)依賴select這個(gè)工具庫(kù)主要完成了對(duì)任意DOM元素的復(fù)制到粘貼板的功能。這次介紹一下clipboard.js源碼中的第二個(gè)依賴的輕型工具庫(kù)t...
摘要:使用字符串定義事件類型,容易產(chǎn)生拼寫錯(cuò)誤并且自動(dòng)完成不能很好的工作。消息和事件的目標(biāo)之間并沒有關(guān)系。通過命名規(guī)范來避免消息被錯(cuò)誤的訂閱者攔截。細(xì)粒度的控制每個(gè)監(jiān)聽器和事件類型。傾向于使用組合而不是繼承。與大多數(shù)人使用的不同。 原文鏈接:Comparison between different Observer Pattern implementations 下面的比較只是關(guān)于訂閱、發(fā)布...
摘要:觀察者模式維護(hù)單一事件對(duì)應(yīng)多個(gè)依賴該事件的對(duì)象關(guān)系發(fā)布訂閱維護(hù)多個(gè)事件主題及依賴各事件主題的對(duì)象之間的關(guān)系觀察者模式是目標(biāo)對(duì)象直接觸發(fā)通知全部通知,觀察對(duì)象被迫接收通知。 觀察者模式(Observer) 觀察者模式:定義了對(duì)象間一種一對(duì)多的依賴關(guān)系,當(dāng)目標(biāo)對(duì)象 Subject 的狀態(tài)發(fā)生改變時(shí),所有依賴它的對(duì)象 Observer 都會(huì)得到通知。 簡(jiǎn)單點(diǎn):女神有男朋友了,朋友圈曬個(gè)圖,甜...
閱讀 2226·2021-11-22 13:54
閱讀 3384·2019-08-29 12:25
閱讀 3447·2019-08-28 18:29
閱讀 3593·2019-08-26 13:40
閱讀 3284·2019-08-26 13:32
閱讀 969·2019-08-26 11:44
閱讀 2238·2019-08-23 17:04
閱讀 2979·2019-08-23 17:02