事件机制模型最简单的应用:函数调用,如例所示:
定义函数:void HandleEvent(){
};
调用函数:
void EventExample(){
HandleEvent()
}
这个简单的函数调用可以理解为:模块A(函数EventExample)触发事件交给给模块B(HandleEvent)处理,这是我理解的最简单的事件机制模型。
上述模型的问题在于:整个事件触发的模块与处理的模块在时间和空间上的关系过于紧密,事件本身任何变化都会引起代码较大修改,比如增加事件携带的信息;
接下来将事件的触发者与事件处理者分别定位为单独的类
事件触发者:
class EventTrigger{
void TrigEvent();
}
事件处理者:
class EventHandler{
void HandleEvent();
}
事件触发者的职责是触发事件,事件处理者的职责是处理事件。为了保证事件被正确处理,那么事件触发者必须了解事件处理者的信息,所以:
EventTrigger或者维护事件处理者的引用或者将事件处理者以参数的形式传入。在两种方式下,事件触发者与事件处理者均硬编码绑定了。
为了解决事件触发者对事件处理者硬编码实现的依赖,可以定义事件处理者的抽象接口:
class IEventHandler{
virtual void HandleEvent();
};
到目前为止,事件机制中还有两个重要的问题:1. 事件信息表达 2. 多个触发者多个处理者交互的情况
首先:定义事件实体
class Event;
然后引入事件分发者:
class Dispatcher;
事件触发者触发事件,并将事件信息传送给事件处理者,这种情况下触发者与处理者直接依赖;
事件触发者触发事件,通知分发者,分发者继续通知事件处理者,则触发者与处理者无直接依赖;
为了解决事件、分发者与触发者和处理者硬编码依赖的问题,分别定义事件与分发者的抽象接口:
class IEvent;
class IDispatcher;
不同的事件子类表示不同的事件
不同的分发者可以支持不同的分发业务逻辑;
至此,简单的事件机制模块阐述完毕!