日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
可能你聽(tīng)過(guò),但不一定這樣用過(guò)

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

創(chuàng)新互聯(lián)公司是一家專(zhuān)注于做網(wǎng)站、網(wǎng)站制作與策劃設(shè)計(jì),龍門(mén)網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)十多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:龍門(mén)等地區(qū)。龍門(mén)做網(wǎng)站價(jià)格咨詢(xún):13518219792

今天我們繼續(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)聽(tīng)和發(fā)布訂閱模式,EventBus使用非常簡(jiǎn)單便捷。

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

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

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

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

使用場(chǎng)景

實(shí)現(xiàn)消息生產(chǎn)者與消費(fèi)者間的解耦,對(duì)應(yīng)事件源與監(jiān)聽(tīng)器,而消息則是事件

通過(guò)事件驅(qū)動(dòng)業(yè)務(wù)流程扭轉(zhuǎn),通過(guò)異步執(zhí)行機(jī)制實(shí)現(xiàn)代碼非阻塞執(zhí)行

擴(kuò)展主線外的分支業(yè)務(wù),減少代碼的侵入,比如各個(gè)環(huán)節(jié)的消息通知、短信提醒等

實(shí)現(xiàn)消息廣播到不同的模塊中

示例

訂單支付時(shí)的消息發(fā)送

// 商品
public class ProductOrder {
private String user; // 用戶(hù)
private String product; // 商品
private double amount; // 金額
@Override
public String toString() {
return String.format("用戶(hù):%s購(gòu)買(mǎi)了商品:%s,總金額:%s", user, product, amount);
}
}
// 事件
@Data
@AllArgsConstructor
public static class CreateOrderEvent implements OrderEvent{
private ProductOrder order;
}
// 監(jiān)聽(tīng)
public static class CreateOrderListener{
@Subscribe
public void onEvent(CreateOrderEvent event) {
log.info("創(chuàng)建訂單:{}", event.getOrder());
}
}

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

// 1. 創(chuàng)建事件總線
EventBus eventBus = new EventBus( ProductOrder.class.getName() );
// 2. 注冊(cè)事件監(jiān)聽(tīng)
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í)我們可以通過(guò)AsyncEventBus建立事件異步總線,這樣在事件被觸發(fā)時(shí),可以異步通知監(jiān)聽(tīng)者完成事件回調(diào),以此來(lái)提高響應(yīng)速度。

核心

  • EventBus

事件總線,可以理解為事件與監(jiān)聽(tīng)器的上下文,主要實(shí)現(xiàn)事件的注冊(cè)、事件的分發(fā)、以及監(jiān)聽(tīng)器的回調(diào),主要提供的方法包括:

register 注冊(cè)監(jiān)聽(tīng),將監(jiān)聽(tīng)器注冊(cè)到事件總線,通過(guò)注解@Subscribe通知其監(jiān)聽(tīng)的事件類(lèi)型(第一個(gè)方法參數(shù)類(lèi)型)

unregister 卸載監(jiān)聽(tīng),從事件總線移除監(jiān)聽(tīng)

post 發(fā)送事件通知,根據(jù)post事件類(lèi)型,找到所有訂閱了該類(lèi)型事件的監(jiān)聽(tīng)器,并將事件推送到監(jiān)聽(tīng)器對(duì)應(yīng)的監(jiān)聽(tīng)方法

  • Subscribe

通過(guò)@Subscribe標(biāo)識(shí)監(jiān)聽(tīng)器所關(guān)注的事件類(lèi)型

  • Event

可以是任何對(duì)象,當(dāng)然不建議將基礎(chǔ)類(lèi)型或String作為事件類(lèi)型,這樣就沒(méi)法做到按類(lèi)型區(qū)分了

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

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

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

總結(jié)

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

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


分享文章:可能你聽(tīng)過(guò),但不一定這樣用過(guò)
URL地址:http://m.5511xx.com/article/dhdhidj.html