冒號課堂§3.4:事件驅動

來源:互聯網
上載者:User

來自於:http://blog.zhenghui.org/2009/09/11/colon-class-3_4/

3.4 事件驅動——有事我叫你,沒事別煩我

 

 

!預覽
  • 它們(同步回調和非同步回調)都使調用者不再依賴被調者,將二者從代碼上解耦,非同步呼叫更將二者從時間上解耦

  • 它們(控制反轉、依賴反轉和依賴注射)的主題是控制與依賴,目的是解耦,方法是反轉,而實現這一切的關鍵是抽象介面

  • “回調”強調的是行為方式——低層反調高層,而“抽象介面”強調的是實現方式——正是由於介面具有抽象性,低層才能在調用它時無需慮及高層的具體細節,從而實現控制反轉

  • 控制反轉導致了事件驅動式編程的被動性

  • 事件驅動式還具有非同步性的特徵,這是由事件的不可預測性與隨機性決定的

  • 獨立是非同步前提,耗時是非同步理由

  • 發行/訂閱模式正是觀察者模式的別名,一方面可看作簡化或退化的事件驅動式,另一方面可看作事件驅動式的核心思想

?提問
  • 什麼是事件?有哪些不同類型的事件?

  • 什麼是回呼函數?什麼是非同步同調?它們有什麼用處?

  • 控制反轉的目的是什嗎?它是如何?的?在架構設計中起什麼作用?

  • 控制反轉、依賴反轉原則和依賴注射的共同點是什嗎?

  • 事件驅動式編程有哪些關鍵步驟?

  • 非同步過程特點和作用是什嗎?

  • 事件驅動式編程最重要的特徵是什嗎?它們是如何?的?

  • 事件驅動式與觀察者模式、MVC架構有何關係?

:講解

逗號漸覺睡蟲上腦,開始閉目點頭。正神遊之際,忽覺腰間一陣酥麻。惺眼微睜,原是被引號的胳膊肘給捅的,頓時警醒。抬頭見講台上的老冒正目光灼灼地盯著自己,不禁臉頰微燙,囁嚅道:“不好意思,昨晚睡得太晚了。”

冒號卻不以為意:“正愁找不到新話題呢,你倒啟發我了。話說課堂上睡覺大抵有三種方式——”

話音未落,有人已笑不自禁。

“第一種是警覺式:想睡可又擔心被老師發現,不時睜眼查看周圍的變化。同時雙耳保持警戒,一有異動立刻挺直身板。”冒號有板有眼地形容,“第二種是寬心式:俯桌酣睡,如處無人之境。境界至高者或可雷打不動,或可鼾聲如雷。”

“總之是很雷人。”歎號的網路新語再度引發笑聲。

冒號繼續分析:“第三種是託付式:請人放哨,非急勿擾。遂再無顧忌,大可封目垂耳,安心入眠。請問你們樂意採用哪種方式?”

“第一種方式睡不踏實,不得已而為之。敢用第二種方式的人多半沒心沒肺,估計IT人都達不到那種境界。只要有同伴在身旁,我想大家都會選第三種方式的。”句號的回答獲得一致認同。

冒號續問:“好,拋開第二種方式不談,為什麼第三種要比第一種優越呢?”

句號回答:“犯困者既要打盹又要警戒,必然苦不堪言。如果把警戒的任務委託同伴,兩人分工合作,自然愉快得多。”

冒號再問:“他們是如何合作的呢?”

“放哨者一旦發現有情況,立即通知犯困者採取行動——睜眼坐直,作認真聽講狀。”句號說得是繪聲繪色。

除了兩位當事人略顯尷尬外,其他人均樂不可支。

眼見時機成熟,冒號不再兜圈:“採用警覺式者主動去輪詢(polling),行為取決於自身的觀察判斷,是流程驅動的,符合常規的流程驅動式編程(Flow-Driven Programming)的模式。採用託付式者被動等通知(notification),行為取決於外來的突發事件,是事件驅動的,符合事件驅動式編程(Event-Driven Programming,簡稱EDP)的模式。下面我們就來說說這種編程範式。”

逗號甕聲甕氣道:“沒想到打瞌睡打出了個範式。”

冒號瞥了他一眼,繼續說下去:“為完成一樣事,既可以採用流程驅動式,也可以採用事件驅動式。這樣的例子在生活中可謂俯拾即是,剛才逗號同學為大家現場示範了一個,誰還能舉出其他範例?”

歎號搶先舉例:“與客戶打交道,推銷員主動打電話或登門拜訪,他的工作是流程驅動的;接線員坐等電話,他的工作是事件驅動的。”

問號也說:“同樣是交通工具,公用汽車主要是流程驅動的,它的路線已預先設定;出租車主要是事件驅動的,它的路線基本上由隨機搭載的乘客所決定。”

引號以個人經驗作例:“購買喜愛的雜誌可以選擇頻繁光顧報刊亭,也可以選擇一次性訂閱。瀏覽關注的新聞網站或部落格,可以直接存取網站,也可以訂閱相應的RSS。主動檢查所關心的內容是否更新是流程驅動的,用訂閱的方式是事件驅動的。”

句號回到本行:“Windows下的許多工作既可以在DOS下用批次程式實現,也可以在圖形介面下完成。前者不需人工幹預,顯然是流程驅動的;後者毫無疑問是事件驅動的。”

“看來你們對這種範式很熟悉嘛。不過,它原理雖簡單,威力卻無窮。看似一招,實則暗藏百式,甚可幻化千招。個中精妙之處,斷非一時可以盡述。”冒號不知不覺中又走進了武俠的世界。

眾人聽了,暗疑老冒有些言過其實。

冒號正式入題:“首當其衝的問題是:何謂事件?通俗地說,它是已經發生的某種令人關注的事情。在軟體中,它一般表現為一個程式的某些資訊狀態上的變化。基於事件驅動的系統一般提供兩類的內建事件(built-in event):一類是底層事件(low-level event)或稱原生事件(native event),在使用者圖形介面(GUI)系統中這類事件直接由滑鼠、鍵盤等硬體裝置觸發;一類是語義事件(semantic event),一般代表使用者的行為邏輯,是若干底層事件的組合。比如滑鼠拖放(drag-and-drop)多表示移動被拖放的對象,由滑鼠按下、滑鼠移動和滑鼠釋放三個底層事件組成。”

問號推想:“編程人員應該還能創造新的事件類型吧?”

“那是當然。”冒號點點頭,“還有一類使用者自訂事件(user-defined event)。它們可以是在原有的內建事件的基礎上進行的封裝,也可以是純粹的虛擬事件(virtual event)。除此之外,編程者不但能定義事件,還能產生事件。雖然大部分事件是由外界激發的自然事件(natural event),但有時程式員需要主動激發一些事件,比如類比使用者滑鼠點擊或鍵盤輸入等,這類事件被稱為合成事件(synthetic event)[1]。這些都進一步豐富完善了事件體系和事件機制,使得事件驅動式編程更具滲透性。”

歎號嘟噥了一句:“看來這裡邊還有點名堂。”

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.