成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

可能你聽過,但不一定這樣用過

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

哈嘍,大家好,我是指北君。

今天我們繼續看看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),

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

責任編輯:武曉燕 來源: Java技術指北
相關推薦

2021-02-26 09:04:22

數組ArrayListHashMap

2020-08-30 14:31:40

Python編程語言開發

2018-02-08 09:11:25

Linux命令rm

2016-11-28 11:19:48

術語神秘

2020-01-03 10:11:01

數據庫安全SQL

2018-03-09 10:34:48

顯卡參數超頻

2018-05-09 15:16:46

電競顯示器外觀

2012-10-16 09:52:27

數據結構

2018-01-18 05:20:59

2024-03-21 17:29:45

2017-01-19 17:57:47

大數據

2021-10-23 06:44:02

性能分析Profiler復雜度分析

2022-09-06 15:35:01

開源軟件OSS

2011-01-12 18:38:25

2009-04-08 08:57:09

鴻海郭臺銘職場出牌學

2013-08-14 18:25:28

2024-07-11 10:50:39

2010-04-14 09:32:40

Office 2010

2013-05-14 10:41:16

Palo AltoNGFWUTM

2010-11-17 11:11:44

跳槽
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美色成人 | www.天天操.com | 在线国产视频观看 | 在线中文字幕国产 | 91av亚洲 | 亚洲免费视频网址 | 免费观看的黄色网址 | 欧美不卡在线 | av午夜电影 | 国外成人在线视频网站 | 国产精久久久久久久妇剪断 | 中国一级特黄真人毛片 | 日韩精品1区2区 | 亚洲视频手机在线 | 日韩欧美中文字幕在线观看 | 先锋资源网站 | 国产精品美女久久久久久久久久久 | 国产一区二区三区在线观看免费 | 精品欧美一区二区三区久久久 | 日韩精品中文字幕在线 | 人人性人人性碰国产 | 91av视频在线观看 | 超碰97免费观看 | 91亚洲国产成人久久精品网站 | 国产精品激情在线 | 日韩欧美在线观看视频 | 亚洲国产精品99久久久久久久久 | 最新日韩欧美 | 久久在线 | 国产视频线观看永久免费 | 亚洲精品一区在线 | 天天影视色综合 | 国产 欧美 日韩 一区 | 国产成人一区 | 国产精品视频中文字幕 | 麻豆天堂 | 精久久| 蜜桃精品噜噜噜成人av | 国产黄色一级电影 | 国产精品久久片 | 久久久久久成人 |