简单事件机制的研究

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

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

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

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

 

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

时间: 2024-12-24 12:05:30

简单事件机制的研究的相关文章

linux套接字通信之recv中的缓存机制的研究

以前一直有这么一个小小的疑惑,当一个进程注册一个套接字后,如果这个套接字没有被调用recv函数接受数据包,那么这个套接字能接受到数据包吗? 或者这样说,如果我的程序注册了一个套接字去接受数据包,但是每收到一个数据包都需要很长一段时间处理,并且在处理数据包的途中recv函数使没有被调用的,那么如果程序再处理数据包的途中有数据包到来,那我的程序会不会漏过这些数据包(那个包到达的时候程序在处理别的包,而没有调用recv函数)? 答案是不会的.事实上linux中会为每个套接字建立缓存,当属于套接字的包到

oracle回滚机制深入研究

这篇文章主要描述oracle的回滚机制,篇幅可能较长,因为对于oracle的回滚机制来说,要讨论和描述的实在太多,只能刷选自己认为最有意义的一部分进行深入研究和分享 一.我们来看一个DML语句的处理过程描述 update undotest set object_type='VIEW' where object_type='PROCEDURE'; 检查shared pool中是否存在相同的语句,如果存在,重用执行计划,执行扫描运算,如果不存在,执行硬解析生成执行计划 根据执行计划中的扫描运算,检查

Android apk动态加载机制的研究(二):资源加载和activity生命周期管理

出处:http://blog.csdn.net/singwhatiwanna/article/details/23387079 (来自singwhatiwanna的csdn博客) 前言 为了更好地阅读本文,你需要先阅读Android apk动态加载机制的研究这篇文章,在此文中,博主分析了Android中apk的动态加载机制,并在文章的最后指出需要解决的两个复杂问题:资源的访问和activity生命周期的管理,而本文将会分析这两个复杂问题的解决方法.需要说明的一点是,我们不可能调起任何一个未安装的

关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究[转]

1.XA XA是由X/Open组织提出的分布式事务的规范.XA规范主要定义了(全局)事务管理器(Transaction Manager)和(局部)资源管理器(Resource Manager)之间的接口.XA接口是双向的系统接口,在事务管理器(Transaction Manager)以及一个或多个资源管理器(Resource Manager)之间形成通信桥梁.XA之所以需要引入事务管理器是因为,在分布式系统中,从理论上讲(参考Fischer等的论文),两台机器理论上无法达到一致的状态,需要引入一

Java反射机制深入研究

ava 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”. 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的.这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制. Java 反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类. 在运行时构造任意一个类的对象. 在运行时判断任意一个类所具有的成员变量和方法. 在运行时调用任意一个对象的方

关于tcc、tlink的编译链接机制的研究

1.学习过程 在c:\下建立文件夹c,并将编译器tcc.exe.连接器tlink.exe.相关文件c0s.obj.cs.lib.emu.lib.maths.lib放入文件夹中. 要搭建一个简单的C语言编译环境,需要TC2.0.c0s.obj.emu.lib.maths.lib.graphics.lib.cs.lib文件.而这里用编译器tcc.exe.连接器tlink.exe代替了TC2.0,而且相关文件也少了graphics.lib,为什么这样也可以呢?我们先尝试在新建立的环境下编译连接一个文件

berkeley db self block机制的研究

bdb mutex有两种用途: 作为latch, 保护资源(内存数据结构, 文件操作); wait-notifiy. 设置SELF_BLOCK标志位. 用在逻辑锁, group commit时等待. mux_win32.c 和mut_tas.c的实现类似, spin, 通过OS机制去 原子tas某lock标志位; 成功则退出. spin不成功, 则 等待-重试. win32通过 WaitForSingleObject, tas通过 OS 线程sleep原语(win32 unlock, 调用Plu

Android6.0 消息机制原理研究

 消息都是存放在一个消息队列中去,而消息循环线程就是围绕这个消息队列进入一个无限循环的,直到线程退出.如果队列中有消息,消息循环线程就会把它取出来,并分发给相应的Handler进行处理:如果队列中没有消息,消息循环线程就会进入空闲等待状态,等待下一个消息的到来.在编写Android应用程序时,当程序执行的任务比较繁重时,为了不阻塞UI主线程而导致ANR的发生,我们通常的做法的创建一个子线程来完成特定的任务.在创建子线程时,有两种选择,一种通过创建Thread对象来创建一个无消息循环的子线程:

关于不同隔离级别下锁机制的研究

众所周之,隔离级别分为:       Read Uncommited:可以读取提交的记录      ReadCommitted:仅读到提交的数据,会产生幻读现象     Repeatable Read :对读取到的数据加锁,并对读取的范围加锁,不存在幻读现象     Serializable:读加读锁写加写锁,串行执行   情况一:主键(where  主键=???) Read Committed隔离级别 show create table key_id; +--------+----------