reactor設計模式(轉)
轉自 http://blog.csdn.net/swordmanwk/article/details/6170995
reactor設計模式,是一種基于事件驅動的設計模式。
《Pattern-Oriented Software Architecture, Volume 2》對這個模式做了詳細的講解。這個模式的結構圖如下:

圖中的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程序員指南》

浙公網安備 33010602011771號