利用程序解决一个问题时,我们通常会确定各个步骤以及步骤的顺序,这就是面向过程编程;而面向对象编程在解决问题的逻辑上仍然是过程化的。为了使步骤之间能够连贯执行,我们需要函数之间的来回调用,使得各函数之间形成依赖。事件驱动编程能够解耦这种依赖关系。
如果完成一件事分为A、B、C三个步骤(函数),A做完了调用B,B做完了调用C,事情结束了。事件驱动编程不需要A、B、C之间的调用,加入一个事件管理器(EventManager,简称EM),A通知EM我做完了(AFinished事件被EM抛出),此时A就不管了,你们谁接着执行跟我没关了。如果B要在A完成后执行,B就可以预先告诉EM,如果A做完了我做(即将B绑定到AFinished事件)。这样A与B之间的关系是由EM控制的,而不需要A、B之间互相调用。
举例解释
我们来举一个“项目开发”的例子,一个项目的开发通常是流水线的,假设是这样:
产品经理先确定需求->交互设计师设计交互过程->开发工程师开发->测试工程师测试->发布
我们把他看成一个面向过程的编程问题,就是产品经理 调用 交互设计师 调用 开发工程师 调用 测试工程师,如图:
用程序语言表示:
|
这种方式相当于一个临时组建的团队,没有负责人,工作合作靠成员之间内部沟通,需要每个步骤的人跟下一个步骤的人沟通,去唤起下一个人的工作。使得下一个人的工作的启动依赖于前一个人。这样每一个步骤都需要对其后续步骤非常清楚。
下面我们请一个项目总监来管理团队,把沟通工作全部交给他,那么方式应该是这样的,如图:
用程序表示如下:
|
这种方式解除了各步骤之间的依赖关系,步骤的先后关系、数据传递关系都由项目总监负责,此时各步骤负责人处于被动位置,不再考虑自己的前后步骤沟通,专注于自己的工作,等待项目总监的调用,这就需要项目总监对项目特别熟悉,如果新增一个步骤,都需要项目总监处理。
那么事件驱动模型是什么方式呢?事件驱动模式也需要一个管理者,但不是项目总监,而是事件管理者(EM),他不需要懂项目,只需要管理好事件即可。这种模式认为被调用者比管理者更清楚应该在什么时候执行。每一个人必须向EM注册当什么事件发生时我执行(事件绑定),每个人可以通过EM抛出一个事件(事件触发)。当一个事件触发时,EM通知绑定这个事件的人执行,如图。
如此,各步骤的执行不等待别人的直接调用,而是等待一个事件的发生(事件被绑定到一个回调)。程序表示如下:
|
ZF2中的事件驱动模式
在ZF2中,事件驱动模式的关键在于:
- 事件,就是一个行为状态(是一个包含数据的Object)
- 事件由事件管理器抛出
- 事件侦听器是一个回调,注册到事件上,对事件的反应
- 事件管理器存储着事件侦听器与事件之间的关联关系,一个事件可以被多个侦听器侦听。通过调用事件管理器抛出事件
事件驱动模式是观察者模式的一种延伸。大量被使用在前端界面开发中。
事件是一个类的对象,可以携带步骤之间交流的数据,事件绑定时可以设置优先级,优先级高的先执行。事件可以被中断。如图:
事件驱动模式在zf2中起着至关重要的作用,module的加载、bootstrap、试图渲染等等都是靠EventManager关联的,如图:
事件模式的简单实现代码:
|
——————————————–
本站除标注[FW]和资讯文章外都为原创文章,转载请注:
转载来源: Coming X
原文链接: Zend Framework 2 事件驱动编程的理解