最近就服務器程序IO效率這一塊了解一下設計模式中的Reacotr模式和proactor模式,感覺跟觀察者模式有些類似的地方,網上也看了一些其他人對三者之間區別的理解,都講得很仔細,在此根據自己的理解做一點簡單的記錄和總結,如果理解不對的地方,以后再慢慢深入和更新。
觀察者模式:
也可以稱為為 發布-訂閱 模式,主要適用於多個對象依賴某一個對象的狀態並,當某對象狀態發生改變時,要通知其他依賴對象做出更新。是一種1對多的關系。當然,如果依賴的對象只有一個時也是一種特殊的一對一關系。通常,觀察者模式適用於消息事件處理,監聽者監聽到事件時通知事件處理者對事件進行處理(這一點上面有點像是回調,容易與反應器模式和前攝器模式的回調搞混淆)。
Reactor模式:
reactor模式,即反應器模式,是一種高效的異步IO模式,特征是 回調,當IO完成時,回調對應的函數進行處理。這種模式並非是真正的異步,而是運用了異步的思想,當io事件觸發時,通知應用程序作出IO處理。模式本身並不調用系統的異步io函數。
Proactor模式:
Proactor模式,即前攝器模式,也是一種高效的異步IO模式,特征也是回調,當IO事件完成時,回調對應的函數對完成事件作出處理。這種模式是真正意義上的異步,屬於系統級的異步,通常要調用系統提供的異步IO函數進行IO處理。
Reactor模式和Proactor模式之間的區別:
Reacor模式不調用系統異步IO函數,是一種仿異步。而Proactor是系統層面上的真正的異步,調用系統提供的異步IO函數。
舉個例子,以網絡IO為例:當我們從套接字讀取數據
1.如果是Reactor模式,那么,反應器會通知我們 “可以讀取數據了”,然后調用回調函數,利用recv函數從套接字讀取數據,類似於MFC中的CSocket,在我們重寫OnRecieve時,內部要調用Recv函數從套接字讀取數據。
2.如果是Proactor模式,那么會先調用WSARecv函數注冊讀事件,反應器會通知我們 “數據已經讀取了”,回調函數觸發時,數據已經被接收到事先提供的緩沖區中,整個IO過程是由操作系統完成的,而不需要我們自己調用recv函數來讀取數據,直接在事先提供的緩沖區取數據就可以了。
觀察者模式和Recactor模式,Proactor模式的主要區別:
觀察者模式,也叫發布-訂閱模式,主要是適用於對象間一對多的依賴關系,通常用作消息分發和處理。而Reactor模式和Proactor模式主要用於高效的io模式,明顯的特征是“回調”思想的運用,提高效率,避免沒有必要的耗時的等待,與對象間的依賴關系無關。