原文地址:
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远程调用的异步特性,在向服务器端请求,接收到响应数据后触发相应的事件,依然走事件驱动的路子。