2011-08-30 43 views
1

我有一個DLL導出一些函數用於獲取或設置一些底層數據對象中的各種值。在某些情況下,DLL會通過註冊的回調函數指針嚮應用程序發出通知。然後,應用程序應該通過DLL接口中的特定功能來響應通知(儘管不是很快)。在收到響應之前,DLL中的數據對象可能會被讀取但不能寫入。有狀態的DLL是狀態模式的良好候選者嗎?

該DLL必須全局導出所有的方法。但是如果通知被提出,所有的設置功能都是禁止的。

關閉我的頭頂我可以想到兩個解決方案:我可以實現一個簡單的基於標誌的狀態機制,並將每個setter包裝在if語句中檢查此標誌。或者我可以按照國家模式實施這兩個國家。

第一個解決方案應該便宜,但要求所有開發人員記得在實現新導出的setter函數時檢查該標誌。如果在某一時刻只讀狀態期望基於原始通知的某種類型的響應,則它可能變得難看。 第二種解決方案需要在兩種狀態下都實現新的導出函數,這提示開發人員考慮函數在只讀模式下執行的操作。但大多數方法都會在兩種狀態下做同樣的事情,其餘的都不應該做任何事情,甚至拋出異常......

有沒有更好的方法來實現類似的東西?

回答

1

怎麼樣:去第二個解決方案,但不要複製你的功能,讓它們保持原樣。相反,將它們全部委託給由兩個類實現的接口:一個表示正常狀態下的行爲,另一個表示只讀狀態。當您切換到只讀狀態時,請將您使用的指針指向只讀實現。如果您擔心在兩個類中重複狀態,請使用包含所有常用數據而不是接口的抽象類。

另一種選擇是指向成員函數的指針:不使用多態調用,而是調用指向成員函數的指針。當您切換到只讀模式時,請更改所有指針,以便它們指向只讀模式成員函數。這樣,你也避免了在你的dll界面中複製函數。

+0

我可能有點不清楚,但我認爲你的一些建議與我的想法相似。我不打算在DLL接口中複製函數 - 我希望DLL的有狀態對使用DLL的應用程序是透明的。 有趣的想法與函數指針...但是當我切換到只讀模式(對不同類型的對象的幾個setter)時,可能會有相當多的函數指針改變。我想我可以把它們放在一個靜態表中並切換整個表格...... –