2012-06-19 55 views
0

現在我有一個客戶端,它向我的服務器發送一個命令列表,它需要數據。我的服務器經由使用GetProcAddress的一個DLL加載這些命令,例如:回調設計模式

InitializeDLL initializeDLL = (InitializeDLL)GetProcAddress(hInstanceLibrary, "InitializeDLL"); 

其中initiailizeDLL定義爲:

typedef int (CALLBACK* InitializeDLL)(int,int); 

客戶端現在發送命令名稱作爲其想要數據的字符串對於。我有很多我希望能夠使用的命令列表,但我不知道如何以有效的方式實現這些命令。我正在考慮創建一個Map,並將該名稱的字符串用作鍵,然後將CALLBACK *用作適當的函數作爲指針。但之後我也必須拋出它。我主要是Java程序員,而不是最好的C++程序員,所以我不確定這個Map想法是否會工作,或者最終如何處理演員。另外,我查看了維基百科上的命令模式,但不知道在這種情況下如何實現。

+0

使用'map <>'似乎不是一個壞主意。給它一個去,如果你遇到問題,你可以回來問不同的問題。關於STL容器的好處在於,只要你輸入「容器」,就可以輕鬆地將其換成另一個容器。 – jxh

+0

所有函數指針是否具有相同的特徵? – Brady

+0

大多數函數指針是相似的,雖然一對返回double而不是int,參數的數量可能會有所不同。 –

回答

0

地圖應該沒問題。將每個字符串映射到一個函數指針的映射,該函數指針在接收到某個消息時執行。如果你想要去的命令模式,那麼你可以有這樣的:因爲年齡 Disclamer,我沒有寫C++代碼,這些代碼可能無法編譯):

abstract class Command{ 
    private: 
    string commandName; 
    CALLBACK* callBackFunction 
    public: 
    Command(string name, CALLBACK* function){ 
     commandName = name; 
     callBackFunction = function; 
    } 
    // Here, you can check your current environment 
    // to see if you can execute this command in the current 
    // configuration and system state 
    bool CanExecute() = 0; 

    // This method does the call to the callback 
    void Execute(){ 
      // call the callback function here 
    } 
} 

這種模式是命令的組合和工廠方法模式。 定義從每個可能條目的抽象類Command繼承的命令。現在,您可以使用帶有命令的字符串映射,而不是使用帶有函數指針的字符串映射。當你得到一個字符串時,首先調用你的命令CanExecute來查看命令是否可以在當前狀態下執行。調用Execute來運行您調用回調函數的命令。 這是我能想到的封裝命令,執行前提條件和實際代碼執行的最佳方式。 (WPF)