回调设计模式

时间:2012-06-19 22:39:21

标签: c++ design-patterns callback

现在我有一个客户端向我的服务器发送一个命令列表,它想要数据。我的服务器使用getProcAddress通过DLL加载这些命令,例如:

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

其中initiailizeDLL定义为:

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

客户端现在将命令名称作为其想要数据的字符串发送。我有很多我希望能够使用的命令列表,而且我不知道如何以有效的方式实现它。我正在考虑创建一个Map并使用字符串作为键,然后使用CALLBACK *作为指针的相应函数。但是之后我还要把它投出去。我主要是一个Java程序员,而不是最好的C ++程序员,所以我不确定这个Map的想法是否会起作用或者最后如何处理演员。另外,我查看了维基百科上的Command模式,但不知道在这种情况下如何实现。

1 个答案:

答案 0 :(得分:0)

地图应该没问题。将每个字符串映射到将在收到特定消息时执行的函数指针的映射。如果你想要命令模式,那么你可以有类似的东西: 免责声明,我从未编写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来运行您调用回调函数的命令。 这是我能想到封装命令,执行前提条件和实际执行代码的最好方法。

另外,这种模式现在广泛用于.NET(WPF)