消息驱动和事件驱动很类似,都是先有一个事件,然后产生一个相应的消息,再把消息放入消息队列,由需要的项目获取。他们的区别是消息是谁产生的
消息驱动:鼠标管自己点击不需要和系统有过多的交互,消息由系统(第三方)循环检测,来捕获并放入消息队列。消息对于点击事件来说是被动产生的,高内聚。
事件驱动:鼠标点击产生点击事件后要向系统发送消息“我点击了”的消息,消息是主动产生的。再发送到消息队列中。
ps:二者都可以根据消息队列判断有没有事件,然后没有的话也都可以进入睡眠。
事件模式耦合高,同模块内好用;消息模式耦合低,跨模块好用。事件模式集成其它语言比较繁琐,消息模式集成其他语言比较轻松。事件是侵入式设计,霸占你的主循环;消息是非侵入式设计,将主循环该怎样设计的自由留给用户。如果你在设计一个东西举棋不定,那么你可以参考win32的GetMessage,本身就是一个藕合度极低的接口,又足够自由,接口任何语言都很方便,具体应用场景再在其基础上封装成事件并不是难事,接口耦合较低,即便哪天事件框架调整,修改外层即可,不会伤经动骨。而如果直接实现成事件,那就完全反过来了。
Jfinal中dreamlu的事件驱动插件Jfinal-event
准备:先新建一个插件。初始化时,扫描指定包里面的有@Listen.class
annotion的类放入List中,然后从每一个监听器的泛型type中获取事件类。生成一个map容器,其中键是事件,值是监听器。然后初始化EventKit(将上面的map传入),方便接下来使用。
工作:在需要监听的地方用EventKit.postEvent(XXXEvent.class)
表示发生了一个XXXEvent.class
事件,然后EventKit
从之前的map中通过XXXEvent.class
知道有哪些监听器会监听这个事件,然后建立一个新的线程执行这些监听器的新的实例并start()
。