事件机制模型最简单的应用:函数调用,如例所示:
定义函数: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; +--------+----------