在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

好用的事件驅動工具:EventBus

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 2023-09-25 14:59 ? 次閱讀

今天我們繼續看看Guava,比較好用的事件驅動工具EventBus

Guava EventBus

EventBus是Guava的事件處理機制,是設計模式中觀察者模式(生產/消費者編程模型)的優雅實現。對于事件監聽和發布訂閱模式,EventBus使用非常簡單便捷。

圖片

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

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

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

為按鈕注冊事件監聽,當按鈕被點擊時,則觸發監聽中相應的回調。在上面的代碼中,有三個角色事件(Event),事件源(Button),監聽(Listener),按鈕作為事件源,當點擊行為觸發時,會將該行為封裝成對應的點擊事件,并根據行為類型將事件傳遞到響應的監聽器上, 這也就是我們常說的監聽器模式。

使用場景

  • 實現消息生產者與消費者間的解耦,對應事件源與監聽器,而消息則是事件
  • 通過事件驅動業務流程扭轉,通過異步執行機制實現代碼非阻塞執行
  • 擴展主線外的分支業務,減少代碼的侵入,比如各個環節的消息通知、短信提醒等
  • 實現消息廣播到不同的模塊中

示例

  • 訂單支付時的消息發送
// 商品
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;
    }
// 監聽
    public static class CreateOrderListener{
        @Subscribe
        public void onEvent(CreateOrderEvent event) {
            log.info("創建訂單:{}", event.getOrder());
        }
    }

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

// 1. 創建事件總線
    EventBus eventBus = new EventBus( ProductOrder.class.getName() );
// 2. 注冊事件監聽
    eventBus.register( new CreateOrderListener() );
    eventBus.register( new PayOrderListener() );
    eventBus.register( new CancelOrderListener() );
    eventBus.register( new RenewOrderListener() );
// 3. 發送事件通知
    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));

同時我們可以通過AsyncEventBus建立事件異步總線,這樣在事件被觸發時,可以異步通知監聽者完成事件回調,以此來提高響應速度。

核心

  • EventBus
    事件總線,可以理解為事件與監聽器的上下文,主要實現事件的注冊、事件的分發、以及監聽器的回調,主要提供的方法包括:
    • register 注冊監聽,將監聽器注冊到事件總線,通過注解@Subscribe通知其監聽的事件類型(第一個方法參數類型)
    • unregister 卸載監聽,從事件總線移除監聽
    • post 發送事件通知,根據post事件類型,找到所有訂閱了該類型事件的監聽器,并將事件推送到監聽器對應的監聽方法
  • Subscribe
    通過*@Subscribe*標識監聽器所關注的事件類型
  • Event
    可以是任何對象,當然不建議將基礎類型或String作為事件類型,這樣就沒法做到按類型區分了

圖片

通過上面的圖就可以很清楚各個各個組件的職責,以及如何通過事件總線完成事件向監聽的傳播,最終基于事件回調機制完成消息傳遞。基于事件驅動的服務模型

上面這種結構的圖形是不是在很多位置都見過,這是一種經典的設計模式。試想一下,我們不通過事件驅動行為時,一般你們怎么寫代碼,通過ifelse?或者其他有著異曲同工的 實現方法,目的最后都是一樣。基于Guava提供的工具,我們不僅在使用時只需要簡單的三個步驟就能實現,同樣,當需要屏蔽該功能時只需要去掉register一行即可,對整體功能 也沒有任何的影響。

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

總結

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

不僅能夠使消息的發起者與接收者之間進行解耦,最主要的是通過消息傳遞渠道實現消息異步傳播,提升系統效率

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 模塊
    +關注

    關注

    7

    文章

    2768

    瀏覽量

    48762
  • 總線
    +關注

    關注

    10

    文章

    2934

    瀏覽量

    89054
  • 代碼
    +關注

    關注

    30

    文章

    4872

    瀏覽量

    69914
  • 工具
    +關注

    關注

    4

    文章

    314

    瀏覽量

    28084
收藏 人收藏

    評論

    相關推薦

    選購電動工具注意事項

    動工具是一種由電動機或電磁鐵為動力,通過傳動機構驅動工作頭進行作業的手持式或可移式的機械化工具
    發表于 11-29 00:01 ?883次閱讀

    驅動電機功率級的性能如何提高電動工具設計

    使用電動工具、園藝工具和吸塵器的家電使用低電壓(2至10節)鋰離子電池供電的電動機驅動。這些工具使用有刷直流 ( BDC)或三相無刷直流(BLDC)電機。BLDC電機效率更高、維護少、
    的頭像 發表于 07-25 09:51 ?6568次閱讀
    <b class='flag-5'>驅動</b>電機功率級的性能如何提高電<b class='flag-5'>動工具</b>設計

    基于電源模塊的電動工具設計

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

    動工具中高邊驅動方案

    在無繩電動工具應用中,電池包的電壓通常為16V、20V、24V、40V、60V和80V,會使用機械開關控制驅動板供電,但是由于機械開關的特性,會存在開關火花、壽命、體積等缺點。圖1:電動工具中機械
    發表于 11-04 07:45

    電機驅動在無線電動工具中的應用

    無線電動工具應用中電機控制設計的考量
    的頭像 發表于 08-22 00:11 ?4105次閱讀

    USB轉串口驅動工具CH341SER的應用程序免費下載

    本文檔的主要內容詳細介紹的是USB轉串口驅動工具CH341SER的應用程序免費下載。
    發表于 03-17 08:00 ?19次下載
    USB轉串口<b class='flag-5'>驅動工具</b>CH341SER的應用程序免費下載

    CH341SER驅動USB轉串口驅動工具軟件免費下載

    本文檔的主要內容詳細介紹的是CH341SER驅動USB轉串口驅動工具免費下載
    發表于 04-24 08:00 ?13次下載
    CH341SER<b class='flag-5'>驅動</b>USB轉串口<b class='flag-5'>驅動工具</b>軟件免費下載

    有刷電動工具和無刷電動工具的區別

    轉速;無刷電動工具高于有刷電動工具。而且采用數字變頻控制,可控性好。有刷電動工具運轉速度低于無刷電動工具,啟動后速度恒定調速不容易。
    發表于 06-25 18:40 ?2.2w次閱讀

    如何解決電動工具散熱問題

    動工具是一種由電動機或電磁力作為動力,通過傳動結構驅動工作頭進行作業的手持式或可移式的機械化工具,具有結構輕巧,攜帶方便的優點,廣泛應用于國民經濟各個領域及日常家庭中。與此同時,電動工具
    發表于 09-02 14:58 ?1879次閱讀

    紅外攝像頭驅動工具ThermoX軟件下載

    紅外攝像頭驅動工具ThermoX軟件下載
    發表于 09-05 17:15 ?91次下載

    動工具中高邊驅動方案分析

    動工具中高邊驅動方案分析
    發表于 10-28 12:00 ?3次下載
    電<b class='flag-5'>動工具</b>中高邊<b class='flag-5'>驅動</b>方案分析

    工業電動工具芯片選型淺析

    動工具是指用手握持操作,以小功率電動機或電磁鐵作為動力,通過傳動機構來驅動作業工作頭的工具。按觸電保護措施的不同可分為三類:I類:在防止觸電的保護方面除了依靠基本絕緣外,還需接零保護的。II類
    的頭像 發表于 02-24 15:51 ?2290次閱讀
    工業電<b class='flag-5'>動工具</b>芯片選型淺析

    好用的串口工具

    好用的串口工具
    發表于 08-15 10:35 ?1次下載

    動工具的主要組成有哪些

    作為一種非常常用的電子產品,電動工具是采用傳動機構驅動工作頭的手持式或可移式的機械化電動化工具,它具有效率高、振動小、易于控制等優點。隨著芯片技術與工業生產技術發展,電動工具朝著小型化
    的頭像 發表于 11-04 15:00 ?1098次閱讀

    數據驅動AI工具好用

    當今,數據驅動AI工具,正逐漸成為企業和研究機構提升效率、優化決策、創新服務的關鍵手段。那么,數據驅動AI工具好用嗎?下面,AI部落小編帶您
    的頭像 發表于 02-14 09:17 ?213次閱讀
    主站蜘蛛池模板: 久久综合香蕉久久久久久久 | 在线色网站 | 视频在线观看h | 国产精品久久久香蕉 | 狠狠色噜狠狠狠狠 | 国产农村乱色xxxx | 国产高清在线精品一区 | 美国一区二区三区 | 男女全黄做爰视频 | 性喷潮久久久久久久久 | 99久久伊人一区二区yy5099 | 亚洲综合春色另类久久 | 色香色香欲天天天影视综合网 | 日韩午夜在线视频不卡片 | 国产美女特级嫩嫩嫩bbb | 日本一区二区视频 | 四虎影院永久免费观看 | 天天爽夜爽免费精品视频 | 妖精视频亚洲 | 两人性潮高免费视频看 | 日韩欧美亚洲综合一区二区 | 网站啪啪 | 亚洲第一网站 | 在线91精品亚洲网站精品成人 | 久久国产色| 51xtv成人影院 | 欧美不卡视频在线 | 日韩亚洲人成网站在线播放 | 美脚连裤袜老师正在播放 | 国产精品自在线天天看片 | 国卡一卡二卡三免费网站 | 天堂资源在线种子资源 | 看久久 | 亚洲国产成人久久精品影视 | 午夜免费福利影院 | 日本免费高清 | 国产精品毛片久久久久久久 | 久久综合久久久久 | 免费视频在线视频观看1 | 中文永久免费看电视网站入口 | 免费看色视频 |