原文地址:
http://www.pjade.com/html/study/20070703/27.html 這些天一直在為Flex程序中的各個(gè)組件之間有效的傳遞參數(shù),協(xié)調(diào)組件間的行為等問題感到困惑。由于Flex程序?qū)嶋H上是一個(gè)運(yùn)行在客戶機(jī)上的的客戶端程序,因此在Flex內(nèi)部組件之間無法像B/S程序基于HTTP協(xié)議那樣發(fā)一個(gè)請(qǐng)求,由服務(wù)器端通過一個(gè)標(biāo)準(zhǔn)接口讀出參數(shù),處理并做出響應(yīng)。也就是說用表單、URL的方式傳遞參數(shù)和控制流程肯定是行不通的。前一段時(shí)間一直嘗試像Javascript中那樣用函數(shù)調(diào)用,甚至是全局變量來做,感覺越做越復(fù)雜,程序的OO結(jié)構(gòu)也受到很大的破壞,十分的煩惱。
今天整理書架時(shí)無意中看到了壓了多年箱底的那本《深入淺出MFC》,一下子回想起VC和MFC框架中的最核心的事件處理機(jī)制,再想到以前研究flexstore源碼時(shí)看見過基于事件來控制程序行為的代碼,頓時(shí)有一種醍醐灌頂?shù)母杏X!! Flex 的客戶端程序基本上是一種基于組件的C/S程序,而當(dāng)年VC、VB、Dephi等等C/S程序無一例外的都是基于事件驅(qū)動(dòng)的!當(dāng)年侯先生正是由于在《深入淺出MFC》一書中深入的剖析了MFC框架中的事件流的機(jī)制,揭示了在API的背后數(shù)據(jù)是如何被分發(fā)和處理的過程而名揚(yáng)五洲。“消息為基礎(chǔ)、事件驅(qū)動(dòng)之”這句話則是在Windows編程中最基本和最重要的概念,也是C/S程序編程中的最重要的概念之一,在搞了多年B/S程序開發(fā)之后,我卻是已經(jīng)將這句當(dāng)年自以為完全理解的觀念拋到腦后去了,想來也挺有意思,看來雖著RIA的發(fā)展和推廣,事件驅(qū)動(dòng)模型這一度幾乎被棄用東西又要大行其道了。
其實(shí)一直以來事件驅(qū)動(dòng)從來沒有遠(yuǎn)離過我們,網(wǎng)頁中一個(gè)對(duì)某個(gè)按鈕的onclick事件的觸發(fā),便是事件驅(qū)動(dòng)的一個(gè)應(yīng)用,但是我卻忘記了在這些基于組件的實(shí)現(xiàn)的編程模型中的事件驅(qū)動(dòng)所起到的靈魂作用。和B/S程序中請(qǐng)求/響應(yīng)的模式不同,事件驅(qū)動(dòng)實(shí)現(xiàn)的是請(qǐng)求/訂閱的方式,二者從架構(gòu)到編程都有很大的區(qū)別,我用B/S的思維模式去寫事件驅(qū)動(dòng)的程序,不亂才怪!事件驅(qū)動(dòng)的技術(shù)原理實(shí)際上是比較簡單的,Observer模式對(duì)它有很好的總結(jié),感興趣的朋友可以自己看一下。我這次最大的問題實(shí)際是來自于思維模式上,其實(shí)只需要:放棄用請(qǐng)求觸發(fā)行為的想法,改用事件觸發(fā)!
當(dāng)然Flex程序并不是像VC那樣的純C/S程序,它一樣需要用請(qǐng)求/響應(yīng)的方式完成很多的功能。今天簡單的思考了一下,覺得Flex程序應(yīng)該這樣架構(gòu):
1. Flex程序的整體架構(gòu)要基于事件驅(qū)動(dòng)模型來架構(gòu)(事實(shí)是這種基于組件的編程方式你必須基于事件驅(qū)動(dòng)來構(gòu)架)。這樣的好處不光是易于實(shí)現(xiàn)功能,而且由于事件驅(qū)動(dòng)松耦合的特點(diǎn),也方便于設(shè)計(jì)一個(gè)很好的系統(tǒng)結(jié)構(gòu)。
2. 對(duì)Flex程序本身,各個(gè)模塊也基于事件驅(qū)動(dòng)的模型按分層、分組件的方式層層搭建。
3. 對(duì)于需要和Flex程序配合使用的服務(wù)器端程序,還是要嚴(yán)格按照MVC模式構(gòu)建。
4. 對(duì)于需要和服務(wù)器端交互的flex客戶端程序模塊,利用flex遠(yuǎn)程調(diào)用的異步特性,在向服務(wù)器端請(qǐng)求,接收到響應(yīng)數(shù)據(jù)后觸發(fā)相應(yīng)的事件,依然走事件驅(qū)動(dòng)的路子。