漫談ACE與設計模式

2021-04-15 15:29:24 字數 2002 閱讀 5366

說起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帶給你的什麼,你在設計中如何使...