計(jì)算機(jī)二級(jí)考試C++輔導(dǎo):ACE中的設(shè)計(jì)模式應(yīng)用場(chǎng)景

字號(hào):

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