說起c++
的系統和網路程式設計開源庫,恐怕沒有人敢否認
ace的王者地位。其實
ace不光是乙個實用的程式庫和框架集,它更是乙個設計模式的典範應用。
ace具有極其明顯的分層體系結構,一般劃分為三個層次:
1. 作業系統適配層
2. c++
包裝層3.
構架和模式層
前面的兩層都是對各個平台的底層
os api
進行包裝,最後化身成通用的
c++類或者函式。舉個簡單的例子,比如
ace_os::sleep(1)
在任何平台下都是休眠一秒,這樣就很方便寫出跨平台的**了。更好玩的是第三層,
ace把設計模式玩到了極致,設計出了許多實用的元件。比如任務和主動物件(
active object
),反應堆(
reactor
),接受器(
acceptor
)和聯結器(
connector
)。下面簡單講一下這三類模式的應用。
1. 任務和主動物件(
active object
)那麼到底什麼是主動物件呢?傳統上,所有的物件都是被動的**段,物件中的**是在對它發出方法呼叫的執行緒中執行的。也就是,呼叫執行緒(
calling threads
)被「借出」,以執行被動物件的方法。
而主動物件卻不一樣。這些物件持有它們自己的執行緒(甚或多個執行緒),並將這個執行緒用於執行對它們的任何方法的呼叫。因而,如果你想象乙個傳統物件,在裡面封裝了乙個執行緒(或多個執行緒),你就得到了乙個主動物件。
ace中的主動物件的實現核心是
ace_task
。要實現乙個主動物件,只需繼承自
ace_task
。ace_task
有幾個虛函式比較重要。
open(), close()
分別是對應服務初始化和關閉。可以在
open()
呼叫activate()
來建立執行緒執行任務。而
ace_task
中的所有主動執行緒的執行入口是虛函式
svc()
。只需在
svc()
中加入你的主動物件需要執行的任務**即可。
2. 反應堆(
ace_reactor
)在設計模式教科書中這麼描述反應堆模式:反應堆本質上提供一組更高階的程式設計抽象,簡化了事件驅動的分布式應用的設計和實現。除此而外,反應堆還將若干不同種類的事件的多路分離整合到易於使用的
api中。特別地,反應堆對基於定時器的事件、訊號事件、基於
i/o埠監控的事件和使用者定義的通知進行統一地處理。
描述地比較抽象,簡單來講就是:
a.建立事件處理器,以處理感興趣的事件。比如
handle_input()
函式處理可能收到的輸入。
int cmyacetask::handle_input (ace_handle fd);
b.把事件處理器指標和感興趣的事件登記到反應堆,具體來說就是
m_reactor->register_handler(this, ace_event_handler::read_mask | ace_event_handler::write_mask );
c.在使用者已登記的某個事件發生時,反應堆發出對處理器中相應方法的**。
3. 接受器(
acceptor
)和聯結器(
connector
)ace_acceptor
工廠允許應用開發者改變「助手」物件,以用於:
被動連線建立
連線建立後的處理
同樣地,
ace_connector
工廠允許應用開發者改變「助手」物件,以用於:
主動連線建立
連線建立後的處理
接受器和聯結器的具體**比較簡單,請見索引文件。
ACE中的設計模式
1 singleton 模式簡介 singleton 是gof 聖經中最簡單的乙個模式了,主要用於建立在系統中具有唯一例項又需要到處使用的類,實現起來非常簡單。include using namespace std class my singleton my singleton my singlet...
漫談設計模式之間的聯絡與區別
敬請期待.聯絡 都是包裝乙個物件。區別 作用不同。裝飾者讓新的行為或責任加入類中,而無需修改現有的 介面卡負責做介面的轉換,允許客戶使用新的庫和子集合,無需改變任何 聯絡 都是定義一些演算法,它們有不同的實現,客戶可以輕易使用不同的演算法。區別 依賴程度不同。模板方法要定義乙個演算法的大綱,由它的子...
關於《漫談設計模式》寫作目的與手段
1.重複 照樣出現,而且時間總是你和老闆的理由。2.多個模式間你不知道如何選取,感覺都可以。3.並且你在開發中對模式仍然念念不忘,為了使用模式而設計,不是自然而然由內而發。4.仍然自負的告訴客戶,我們做的就是這樣,你的需求無法實現。5.最後,捫心自問下 什麼是oo,oo帶給你的什麼,你在設計中如何使...