成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

事件派發(fā)器模式

Yujiaao / 2088人閱讀

摘要:在項(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 Map handlers = 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

相關(guān)文章

  • 【全棧React】第18天: Flux 簡(jiǎn)介

    摘要:在方法中處理數(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...

    mtunique 評(píng)論0 收藏0
  • Dubbo 源碼分析 - 服務(wù)調(diào)用過程

    摘要:服務(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ò)...

    Travis 評(píng)論0 收藏0
  • clipboard.js代碼分析(2)-emitter

    摘要:用于在同一主模塊下的不同子模塊以及不同主模塊之間的通信,支持動(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...

    MoAir 評(píng)論0 收藏0
  • [翻譯] 比較不同Observer模式的實(shí)現(xiàn)

    摘要:使用字符串定義事件類型,容易產(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ā)布...

    Hegel_Gu 評(píng)論0 收藏0
  • JavaScript 設(shè)計(jì)模式(六):觀察者模式與發(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è)圖,甜...

    bingo 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<