zoukankan      html  css  js  c++  java
  • reactor设计模式(转)

    转自 http://blog.csdn.net/swordmanwk/article/details/6170995

      reactor设计模式,是一种基于事件驱动的设计模式。

      《Pattern-Oriented Software Architecture, Volume 2》对这个模式做了详细的讲解。这个模式的结构图如下:

    reactor模式类结构图

      图中的handle对应的是操作系统提供的句柄,如I/O句柄,Event_Handler类持有这些句柄。reactor类内部提供一个事件循环:handle_events()。事件循环的代码实现利用了操作系统提供的多路分离函数,WaitForMultipleObjects或者select等。这些多路分离的函数的特点是,可以同时等待多个句柄,在等待过程中所在线程处于挂起状态,不消耗CPU时间。一旦某个句柄被触发,线程则被唤醒,函数将返回,线程可以执行后面的代码。利用多路分离函数的这一特点,根据被激活的句柄对应的特定事件,调用相关的事件处理函数,可以实现事件循环。

      register_handler()函数用于将Event_Handler对象注册到事件驱动列表中,保证对于某一类型的事件,会调用Event_Handler类的响应函数handle_event()。reactor类在做多路分离时需要操纵Event_Handler类的Handle,因此Event_Handler类需要提供get_handle()函数。另外,当程序不需要再对特定事件响应时,需要把Event_Handler对象从事件驱动列表中删除,因此reactor类还实现了remove_handler函数。

      因为reactor相对稳定,一旦实现,不需要再定制,所以没有提供一个抽象接口类,但Event_Handler是经常需要根据不同的需求定制的,因此需要提供一个抽象接口类,然后根据实际需求编写派生类,提供具体句柄,并实现相关虚函数。

      这个模式的优点是本身不涉及多线程,从而避免了线程的上下文切换。对于响应事件处理时间较短的情况下,可以考虑使用这个模式。如果处理一个事件需要花费大量时间,就不能使用这个模式,那样会导致其他事件处理被阻塞。

      ACE_Reactor框架是这一模式的半成品,用户只要做三件事情就可以实现并使用这一模式:

      1.从ACE_Event_Handler派生一个或多个类

      2.向ACE_Reactor类登记应用的事件处理对象

      3.运行ACE_Reactor事件循环。

      示例代码可以参考ACE_wrappers/examples/APG/Reactor目录下的示例代码。

    参考文献:

      《Pattern-Oriented Software Architecture, Volume 2》

      《ACE程序员指南》

  • 相关阅读:
    CSS中:display:none与visible:hidden的区别
    $(function(){})和$(document).ready(function(){}) 的用法
    JavaScript 全选函数的实现
    HTML:关于a标签的target属性
    CSS:给 input 中 type="text" 设置CSS样式
    JavaScript中“javascript:void(0) ”是什么意思
    Oracle数据库——数据库安全性管理
    使用JavaScript根据从后台获取来的数据打开一个新的页面
    java reflect反射---Java高级开发必须懂的
    Java 类加载机制
  • 原文地址:https://www.cnblogs.com/log-a/p/4000244.html
Copyright © 2011-2022 走看看