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