我有一個Animation類。我需要在動畫中有一些觀察者爲Play
,Pause
和Stop
事件。我發現了這個問題的兩個解決方案,但我不知道該選什麼。如何在C++中實現觀察者模式
使用boost ::信號或類似的東西,並註冊的回調,每一個事件
做一個簡單的界面,與3個純虛函數(
OnPlay()
,OnPause()
,OnStop()
),並傳遞給動畫類對象實現這個接口。
每種方法都有其優點和缺點。我會盡力枚舉我迄今發現的:
優勢1.
- 我可以使用任何成員函數/ free函數作爲回調
- 我沒有實現所有3個功能,如果我不在乎所有的人
- 同一個對象可以作爲觀察員多個動畫,而不從動畫類傳遞參數獲取
缺點爲1
- 我要創建一個可調用對象逢回調
- 如果我想以後添加一個新的事件將很難找到它被使用的地方(編譯不能強制我實施或忽略新事件)。
- 不知何故奇怪的語法(我必須在任何地方使用std :: bind/boost :: bind)。
優勢2.
- 易於理解建設
- 如果我將在動畫/ Observer接口類中添加一個新的事件,編譯器將強制執行我實現(空也許)新的功能。
缺點爲2
- 我要實現(空可能),即使我會用3個功能只有一個
- 同一個對象不能被用來作爲觀察員不同動畫,而不需要從動畫(ID或其他)發送一些額外的參數。
- 不能使用自由功能。
您能否告訴我要使用什麼?根據你的經驗,對於這個問題有什麼更好的解決方案 - 從第一個問題中解脫出來,還是從第二個問題中清楚和容易理解的代碼?你能否給我兩種方法或其他解決方案的其他優點/缺點?
熟悉在C++ 11(我假設你可以使用,因爲你用它標記的問題)lambda表達式除去大部分「弊端的1" 。 –
如果使用'std :: bind'對你來說是一種奇怪的語法(特別是與具有虛擬'OnWhatever'功能的接口相比),那麼你應該重新考慮你選擇的語言。 –
@ChristianRau不適合我,但我不是唯一一個在代碼庫上工作的人。 – Felics