什么是ACE,即Adapter Communicate Envirment, "適配器通信環(huán)境",這是一個C++開發(fā)的網(wǎng)絡通信框架,其自身是開源的。因為其誕生時間早(與Linux同一年出生),且其所提供的功能很好很強大,我們可以使用它完成可跨越多種平臺完成通用的通信軟件任務,其中包括:事件多路分離和事件處理器分派、信號處理、服務初始化、進程間通信、共享內(nèi)存管理、消息路由、分布式服務動態(tài)(重)配置、并發(fā)執(zhí)行和同步等等。 且代碼開發(fā)非常規(guī)范(大約100萬行精心構造的C++代碼),是一部不可多得的學習教材。該框架的創(chuàng)始人信息如下: Douglas C. Schmidt,美國Vanderbilt大學電子工程與計算機科學系教授,ACE與TAO項目的創(chuàng)始人。 (從美國海軍到CERN物理實驗室,從Boeing Advanced Avionics Systems到都能看到這兩個軟件的蹤影) 他是中間件技術的先驅(qū)之一,在相關領域發(fā)表了百余篇學術論文。 包括Microsoft在內(nèi)的許多公司都受到了他在通信軟件技術方面的貢獻的影響(國內(nèi)也有一些網(wǎng)游公司使用該框架作為其通信機制實現(xiàn)平臺)。
首先介紹一下Bridge(橋模式)在ACE框架中的運用: 通信軟件常常要對各種類型的事件進行多路分離、并進通行相應的處理。為使各種事件驅(qū)動的處理活動 統(tǒng)一起來、并得以自動化,ACE提供了叫做ACE_Reactor的事件多路分離和事件處理器分派框架。同時,為 了保證應用的可移植性,無論是在何種操作系統(tǒng)上,也無論底層使用了何種事件多路分離機制,ACE_Reactor 所提供的接口都是一樣的;并且,在有些平臺上,還可以根據(jù)實際需要,在運行時更換底層所使用的事件多 路分離機制(比如在Windows上既可以使用WaitForMultipleObjects(),也可以使用select())。 Bridge模式正是ACE_Reactor具有這樣的靈活性和可移植性的關鍵所在。 值得特別注意的是ACE_Reactor的私有成員reactor_impl_,這個指針變量正是ACE_Reactor中的“橋”實現(xiàn)的關鍵所在。
ACE是具有高度可移植性的跨平臺通信軟件開發(fā)框架,在各種平臺上提供相同的開發(fā)接口,是其重要目標之一。
上面所描述的ACE_Reactor接口及相關接口,在 ACE支持的各種平臺上都是相同的,但因為這些平臺 提供的多路分離機制各不相同,所以在開發(fā)ACE_Reactor 時,必須為不同的平臺提供不同的具體實現(xiàn)。要達到這一目的,一般的做法是為每種平臺定義一個繼承自 ACE_Reactor類的子類,在子類中提供該平臺專 用的具體實現(xiàn)。 但正如GoF在Design Pattern一書中所說,這樣的繼承把實現(xiàn)與抽象永久性地綁定在一起, 使得我們難以獨立地修改、擴展和復用各種抽象和實現(xiàn)。正是基于這樣的考慮,ACE的開發(fā)者在實現(xiàn) ACE_Reactor時,采用了Bridge模式。
下圖以ACE_Select_Reactor和ACE_WFMO_Reactor為例,說明了體現(xiàn)在ACE_Reactor中的Bridge 模式:我們可以對照Design Pattern書。
Abstraction(ACE_Reactor) 定義ACE_Reactor抽象的接口,并維護有一個指針reactor_impl_,指向Implementor類型的一個對象。 許多操作都將通過該指針轉發(fā)給具體的Implementor對象。 RefinedAbstraction(無) 在ACE中沒有定義RefinedAbstraction,但如果你想要對 ACE_Reactor接口進行擴展,就可以定義自己的。
Implementor(Reactor_Impl)定義Reactor實現(xiàn)類的接口。
ConcreteImplementor(ACE_Select_Reactor和ACE_WFMO_Reactor) 實現(xiàn)Reactor_Impl接口,并定義其具體實現(xiàn)。除了這里提到的到的ACE_Select_Reactor和 ACE_WFMO_Reactor,在ACE 中還定義了ACE_Dev_Poll_Reactor(基于“/dev/poll”或 “/dev/epoll” 的Reactor實現(xiàn))和ACE_TP_Reactor(支持基于線程池的事件分派)等其他類型的Reactor。詳情可查閱 ACE 的參考文檔:因為ACE_Reactor的實現(xiàn)采用了Bridge模式,我們在使用ACE_Reactor時擁有很大的靈活性。比如說, 在Windows 平臺上,系統(tǒng)提供的WaitForMultpleObjects()同時只能在64個句柄上等待,而ACE_WFMO _Reactor 在使用了2個句柄進行內(nèi)部管理,所以如果你使用的是 ACE_WFMO_Reactor,實際上只能同時 等待62個句柄,對于大型應用來說,這往往是不夠的(顯然,這個問題并非是Douglas C. Schmidt的錯, 而是Bill Gates的錯)。如果你不需要使用ACE_WFMO_Reactor提供的一些特別的功能(比如等待同步事 件),你可以改用ACE_Select_Reactor來進行事件多路分離:
ACE_Select_Reactor select_reactor; ACE_Reactor reactor (&select_reactor); ... ... 通過使用面向?qū)ο蠹夹g及Bridge模式,ACE_Reactor具備了以下特性:
1.統(tǒng)一的OO多路分離和分派接口
2.自動進行事件處理器分派
3.支持透明的擴展
4.增加復用
5.增強類型安全性
6.改善可移植性
7.線程安全性
首先介紹一下Bridge(橋模式)在ACE框架中的運用: 通信軟件常常要對各種類型的事件進行多路分離、并進通行相應的處理。為使各種事件驅(qū)動的處理活動 統(tǒng)一起來、并得以自動化,ACE提供了叫做ACE_Reactor的事件多路分離和事件處理器分派框架。同時,為 了保證應用的可移植性,無論是在何種操作系統(tǒng)上,也無論底層使用了何種事件多路分離機制,ACE_Reactor 所提供的接口都是一樣的;并且,在有些平臺上,還可以根據(jù)實際需要,在運行時更換底層所使用的事件多 路分離機制(比如在Windows上既可以使用WaitForMultipleObjects(),也可以使用select())。 Bridge模式正是ACE_Reactor具有這樣的靈活性和可移植性的關鍵所在。 值得特別注意的是ACE_Reactor的私有成員reactor_impl_,這個指針變量正是ACE_Reactor中的“橋”實現(xiàn)的關鍵所在。
ACE是具有高度可移植性的跨平臺通信軟件開發(fā)框架,在各種平臺上提供相同的開發(fā)接口,是其重要目標之一。
上面所描述的ACE_Reactor接口及相關接口,在 ACE支持的各種平臺上都是相同的,但因為這些平臺 提供的多路分離機制各不相同,所以在開發(fā)ACE_Reactor 時,必須為不同的平臺提供不同的具體實現(xiàn)。要達到這一目的,一般的做法是為每種平臺定義一個繼承自 ACE_Reactor類的子類,在子類中提供該平臺專 用的具體實現(xiàn)。 但正如GoF在Design Pattern一書中所說,這樣的繼承把實現(xiàn)與抽象永久性地綁定在一起, 使得我們難以獨立地修改、擴展和復用各種抽象和實現(xiàn)。正是基于這樣的考慮,ACE的開發(fā)者在實現(xiàn) ACE_Reactor時,采用了Bridge模式。
下圖以ACE_Select_Reactor和ACE_WFMO_Reactor為例,說明了體現(xiàn)在ACE_Reactor中的Bridge 模式:我們可以對照Design Pattern書。
Abstraction(ACE_Reactor) 定義ACE_Reactor抽象的接口,并維護有一個指針reactor_impl_,指向Implementor類型的一個對象。 許多操作都將通過該指針轉發(fā)給具體的Implementor對象。 RefinedAbstraction(無) 在ACE中沒有定義RefinedAbstraction,但如果你想要對 ACE_Reactor接口進行擴展,就可以定義自己的。
Implementor(Reactor_Impl)定義Reactor實現(xiàn)類的接口。
ConcreteImplementor(ACE_Select_Reactor和ACE_WFMO_Reactor) 實現(xiàn)Reactor_Impl接口,并定義其具體實現(xiàn)。除了這里提到的到的ACE_Select_Reactor和 ACE_WFMO_Reactor,在ACE 中還定義了ACE_Dev_Poll_Reactor(基于“/dev/poll”或 “/dev/epoll” 的Reactor實現(xiàn))和ACE_TP_Reactor(支持基于線程池的事件分派)等其他類型的Reactor。詳情可查閱 ACE 的參考文檔:因為ACE_Reactor的實現(xiàn)采用了Bridge模式,我們在使用ACE_Reactor時擁有很大的靈活性。比如說, 在Windows 平臺上,系統(tǒng)提供的WaitForMultpleObjects()同時只能在64個句柄上等待,而ACE_WFMO _Reactor 在使用了2個句柄進行內(nèi)部管理,所以如果你使用的是 ACE_WFMO_Reactor,實際上只能同時 等待62個句柄,對于大型應用來說,這往往是不夠的(顯然,這個問題并非是Douglas C. Schmidt的錯, 而是Bill Gates的錯)。如果你不需要使用ACE_WFMO_Reactor提供的一些特別的功能(比如等待同步事 件),你可以改用ACE_Select_Reactor來進行事件多路分離:
ACE_Select_Reactor select_reactor; ACE_Reactor reactor (&select_reactor); ... ... 通過使用面向?qū)ο蠹夹g及Bridge模式,ACE_Reactor具備了以下特性:
1.統(tǒng)一的OO多路分離和分派接口
2.自動進行事件處理器分派
3.支持透明的擴展
4.增加復用
5.增強類型安全性
6.改善可移植性
7.線程安全性