简单事件机制的研究

事件机制模型最简单的应用:函数调用,如例所示:

定义函数: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;

不同的事件子类表示不同的事件

不同的分发者可以支持不同的分发业务逻辑;

至此,简单的事件机制模块阐述完毕!

原文地址:https://www.cnblogs.com/yellowcat/p/5260301.html