91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

好用的事件驅(qū)動(dòng)工具:EventBus

科技綠洲 ? 來源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-09-25 14:59 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

今天我們繼續(xù)看看Guava,比較好用的事件驅(qū)動(dòng)工具EventBus

Guava EventBus

EventBus是Guava的事件處理機(jī)制,是設(shè)計(jì)模式中觀察者模式(生產(chǎn)/消費(fèi)者編程模型)的優(yōu)雅實(shí)現(xiàn)。對(duì)于事件監(jiān)聽和發(fā)布訂閱模式,EventBus使用非常簡單便捷。

圖片

如果你做過CS的開發(fā),下面這段代碼可能會(huì)比較熟悉。

Button button = new Button("確定");

button.addListener( new Listener(){
    ...
    public void onClick(Event event){
        // 
    }
    ...
} );

為按鈕注冊(cè)事件監(jiān)聽,當(dāng)按鈕被點(diǎn)擊時(shí),則觸發(fā)監(jiān)聽中相應(yīng)的回調(diào)。在上面的代碼中,有三個(gè)角色事件(Event),事件源(Button),監(jiān)聽(Listener),按鈕作為事件源,當(dāng)點(diǎn)擊行為觸發(fā)時(shí),會(huì)將該行為封裝成對(duì)應(yīng)的點(diǎn)擊事件,并根據(jù)行為類型將事件傳遞到響應(yīng)的監(jiān)聽器上, 這也就是我們常說的監(jiān)聽器模式。

使用場景

  • 實(shí)現(xiàn)消息生產(chǎn)者與消費(fèi)者間的解耦,對(duì)應(yīng)事件源與監(jiān)聽器,而消息則是事件
  • 通過事件驅(qū)動(dòng)業(yè)務(wù)流程扭轉(zhuǎn),通過異步執(zhí)行機(jī)制實(shí)現(xiàn)代碼非阻塞執(zhí)行
  • 擴(kuò)展主線外的分支業(yè)務(wù),減少代碼的侵入,比如各個(gè)環(huán)節(jié)的消息通知、短信提醒等
  • 實(shí)現(xiàn)消息廣播到不同的模塊中

示例

  • 訂單支付時(shí)的消息發(fā)送
// 商品
public class ProductOrder {
    private String user; // 用戶
    private String product; // 商品
    private double amount; // 金額
    @Override
    public String toString() {
        return String.format("用戶:%s購買了商品:%s,總金額:%s", user, product, amount);
    }
}
// 事件
    @Data
    @AllArgsConstructor
    public static class CreateOrderEvent implements OrderEvent{
        private ProductOrder order;
    }
// 監(jiān)聽
    public static class CreateOrderListener{
        @Subscribe
        public void onEvent(CreateOrderEvent event) {
            log.info("創(chuàng)建訂單:{}", event.getOrder());
        }
    }

測(cè)試: 我們可以定義各種事件,比如訂單創(chuàng)建、訂單取消、訂單支付... 只需要簡單的三個(gè)步驟即可:

// 1. 創(chuàng)建事件總線
    EventBus eventBus = new EventBus( ProductOrder.class.getName() );
// 2. 注冊(cè)事件監(jiān)聽
    eventBus.register( new CreateOrderListener() );
    eventBus.register( new PayOrderListener() );
    eventBus.register( new CancelOrderListener() );
    eventBus.register( new RenewOrderListener() );
// 3. 發(fā)送事件通知
    eventBus.post(new ProductOrder.CreateOrderEvent(order));
    TimeUnit.SECONDS.sleep(1);
    eventBus.post(new ProductOrder.CancelOrderEvent(order));
    TimeUnit.SECONDS.sleep(1);
    eventBus.post(new ProductOrder.RenewOrderEvent(order));
    TimeUnit.SECONDS.sleep(1);
    eventBus.post(new ProductOrder.PayOrderEvent(order));
    TimeUnit.SECONDS.sleep(5);
    eventBus.post(new ProductOrder.ReturnOrderEvent(order));

同時(shí)我們可以通過AsyncEventBus建立事件異步總線,這樣在事件被觸發(fā)時(shí),可以異步通知監(jiān)聽者完成事件回調(diào),以此來提高響應(yīng)速度。

核心

  • EventBus
    事件總線,可以理解為事件與監(jiān)聽器的上下文,主要實(shí)現(xiàn)事件的注冊(cè)、事件的分發(fā)、以及監(jiān)聽器的回調(diào),主要提供的方法包括:
    • register 注冊(cè)監(jiān)聽,將監(jiān)聽器注冊(cè)到事件總線,通過注解@Subscribe通知其監(jiān)聽的事件類型(第一個(gè)方法參數(shù)類型)
    • unregister 卸載監(jiān)聽,從事件總線移除監(jiān)聽
    • post 發(fā)送事件通知,根據(jù)post事件類型,找到所有訂閱了該類型事件的監(jiān)聽器,并將事件推送到監(jiān)聽器對(duì)應(yīng)的監(jiān)聽方法
  • Subscribe
    通過*@Subscribe*標(biāo)識(shí)監(jiān)聽器所關(guān)注的事件類型
  • Event
    可以是任何對(duì)象,當(dāng)然不建議將基礎(chǔ)類型或String作為事件類型,這樣就沒法做到按類型區(qū)分了

圖片

通過上面的圖就可以很清楚各個(gè)各個(gè)組件的職責(zé),以及如何通過事件總線完成事件向監(jiān)聽的傳播,最終基于事件回調(diào)機(jī)制完成消息傳遞?;谑录?qū)動(dòng)的服務(wù)模型

上面這種結(jié)構(gòu)的圖形是不是在很多位置都見過,這是一種經(jīng)典的設(shè)計(jì)模式。試想一下,我們不通過事件驅(qū)動(dòng)行為時(shí),一般你們?cè)趺磳懘a,通過ifelse?或者其他有著異曲同工的 實(shí)現(xiàn)方法,目的最后都是一樣。基于Guava提供的工具,我們不僅在使用時(shí)只需要簡單的三個(gè)步驟就能實(shí)現(xiàn),同樣,當(dāng)需要屏蔽該功能時(shí)只需要去掉register一行即可,對(duì)整體功能 也沒有任何的影響。

在我們引入某種設(shè)計(jì)模式,某種架構(gòu)模型時(shí),總的目的都是為了降低代碼模塊間的耦合度,提升代碼整體的可讀性,最終讓代碼能夠易于維護(hù)性,或者有一定的復(fù)用性。

總結(jié)

事件監(jiān)聽模式、觀察者模式、發(fā)布訂閱模式,都是非常的相似,通過建立事件與監(jiān)聽器、觀察者與被觀察者、生產(chǎn)者與消費(fèi)者者間消息傳遞媒介(示例中的事件總線EventBus),

不僅能夠使消息的發(fā)起者與接收者之間進(jìn)行解耦,最主要的是通過消息傳遞渠道實(shí)現(xiàn)消息異步傳播,提升系統(tǒng)效率

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 模塊
    +關(guān)注

    關(guān)注

    7

    文章

    2837

    瀏覽量

    53283
  • 總線
    +關(guān)注

    關(guān)注

    10

    文章

    3040

    瀏覽量

    91658
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4967

    瀏覽量

    73960
  • 工具
    +關(guān)注

    關(guān)注

    4

    文章

    317

    瀏覽量

    28868
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    選購電動(dòng)工具注意事項(xiàng)

    動(dòng)工具是一種由電動(dòng)機(jī)或電磁鐵為動(dòng)力,通過傳動(dòng)機(jī)構(gòu)驅(qū)動(dòng)工作頭進(jìn)行作業(yè)的手持式或可移式的機(jī)械化工具。
    發(fā)表于 11-29 00:01 ?1091次閱讀

    基于電源模塊的電動(dòng)工具設(shè)計(jì)

    動(dòng)工具、 園藝工具和吸塵器等家電使用低電壓(2至10節(jié))鋰離子電池供電的電機(jī)驅(qū)動(dòng)。這些工具使用有刷直流(BDC)或三相無刷直流(BLDC)電機(jī)。BLDC電機(jī)效率更高、維護(hù)少、噪音小、
    發(fā)表于 07-22 08:10

    動(dòng)工具中高邊驅(qū)動(dòng)方案

    在無繩電動(dòng)工具應(yīng)用中,電池包的電壓通常為16V、20V、24V、40V、60V和80V,會(huì)使用機(jī)械開關(guān)控制驅(qū)動(dòng)板供電,但是由于機(jī)械開關(guān)的特性,會(huì)存在開關(guān)火花、壽命、體積等缺點(diǎn)。圖1:電動(dòng)工具中機(jī)械
    發(fā)表于 11-04 07:45

    電機(jī)驅(qū)動(dòng)在無線電動(dòng)工具中的應(yīng)用

    無線電動(dòng)工具應(yīng)用中電機(jī)控制設(shè)計(jì)的考量
    的頭像 發(fā)表于 08-22 00:11 ?4801次閱讀

    USB轉(zhuǎn)串口驅(qū)動(dòng)工具CH341SER的應(yīng)用程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是USB轉(zhuǎn)串口驅(qū)動(dòng)工具CH341SER的應(yīng)用程序免費(fèi)下載。
    發(fā)表于 03-17 08:00 ?19次下載
    USB轉(zhuǎn)串口<b class='flag-5'>驅(qū)動(dòng)工具</b>CH341SER的應(yīng)用程序免費(fèi)下載

    CH341SER驅(qū)動(dòng)USB轉(zhuǎn)串口驅(qū)動(dòng)工具軟件免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是CH341SER驅(qū)動(dòng)USB轉(zhuǎn)串口驅(qū)動(dòng)工具免費(fèi)下載
    發(fā)表于 04-24 08:00 ?15次下載
    CH341SER<b class='flag-5'>驅(qū)動(dòng)</b>USB轉(zhuǎn)串口<b class='flag-5'>驅(qū)動(dòng)工具</b>軟件免費(fèi)下載

    有刷電動(dòng)工具和無刷電動(dòng)工具的區(qū)別

    轉(zhuǎn)速;無刷電動(dòng)工具高于有刷電動(dòng)工具。而且采用數(shù)字變頻控制,可控性好。有刷電動(dòng)工具運(yùn)轉(zhuǎn)速度低于無刷電動(dòng)工具,啟動(dòng)后速度恒定調(diào)速不容易。
    發(fā)表于 06-25 18:40 ?2.4w次閱讀

    如何解決電動(dòng)工具散熱問題

    動(dòng)工具是一種由電動(dòng)機(jī)或電磁力作為動(dòng)力,通過傳動(dòng)結(jié)構(gòu)驅(qū)動(dòng)工作頭進(jìn)行作業(yè)的手持式或可移式的機(jī)械化工具,具有結(jié)構(gòu)輕巧,攜帶方便的優(yōu)點(diǎn),廣泛應(yīng)用于國民經(jīng)濟(jì)各個(gè)領(lǐng)域及日常家庭中。與此同時(shí),電動(dòng)工具
    發(fā)表于 09-02 14:58 ?2225次閱讀

    紅外攝像頭驅(qū)動(dòng)工具ThermoX軟件下載

    紅外攝像頭驅(qū)動(dòng)工具ThermoX軟件下載
    發(fā)表于 09-05 17:15 ?115次下載

    動(dòng)工具中高邊驅(qū)動(dòng)方案分析

    動(dòng)工具中高邊驅(qū)動(dòng)方案分析
    發(fā)表于 10-28 12:00 ?3次下載
    電<b class='flag-5'>動(dòng)工具</b>中高邊<b class='flag-5'>驅(qū)動(dòng)</b>方案分析

    好用的串口工具

    好用的串口工具
    發(fā)表于 08-15 10:35 ?3次下載

    動(dòng)工具的主要組成有哪些

    作為一種非常常用的電子產(chǎn)品,電動(dòng)工具是采用傳動(dòng)機(jī)構(gòu)驅(qū)動(dòng)工作頭的手持式或可移式的機(jī)械化電動(dòng)化工具,它具有效率高、振動(dòng)小、易于控制等優(yōu)點(diǎn)。隨著芯片技術(shù)與工業(yè)生產(chǎn)技術(shù)發(fā)展,電動(dòng)工具朝著小型化
    的頭像 發(fā)表于 11-04 15:00 ?2670次閱讀

    數(shù)據(jù)驅(qū)動(dòng)AI工具好用

    當(dāng)今,數(shù)據(jù)驅(qū)動(dòng)AI工具,正逐漸成為企業(yè)和研究機(jī)構(gòu)提升效率、優(yōu)化決策、創(chuàng)新服務(wù)的關(guān)鍵手段。那么,數(shù)據(jù)驅(qū)動(dòng)AI工具好用嗎?下面,AI部落小編帶您
    的頭像 發(fā)表于 02-14 09:17 ?817次閱讀

    適用于電動(dòng)工具/馬達(dá)驅(qū)動(dòng)的2.5A全橋驅(qū)動(dòng)電路AiP2180

    適用于電動(dòng)工具/馬達(dá)驅(qū)動(dòng)的2.5A全橋驅(qū)動(dòng)電路AiP2180
    的頭像 發(fā)表于 04-30 09:46 ?364次閱讀
    適用于電<b class='flag-5'>動(dòng)工具</b>/馬達(dá)<b class='flag-5'>驅(qū)動(dòng)</b>的2.5A全橋<b class='flag-5'>驅(qū)動(dòng)</b>電路AiP2180

    產(chǎn)品推薦 | MOS管在電動(dòng)工具產(chǎn)品上的應(yīng)用

    動(dòng)工具的定義及結(jié)構(gòu)電動(dòng)工具是由電力驅(qū)動(dòng)工具,可以通過電池、電源或電動(dòng)機(jī)來提供動(dòng)力。電動(dòng)工具的發(fā)明和應(yīng)用在現(xiàn)代工業(yè)和生活中起到了重要的作用
    的頭像 發(fā)表于 07-16 14:09 ?789次閱讀
    產(chǎn)品推薦 | MOS管在電<b class='flag-5'>動(dòng)工具</b>產(chǎn)品上的應(yīng)用