现在我有一个客户端向我的服务器发送一个命令列表,它想要数据。我的服务器使用getProcAddress通过DLL加载这些命令,例如:
InitializeDLL initializeDLL = (InitializeDLL)GetProcAddress(hInstanceLibrary, "InitializeDLL");
其中initiailizeDLL定义为:
typedef int (CALLBACK* InitializeDLL)(int,int);
客户端现在将命令名称作为其想要数据的字符串发送。我有很多我希望能够使用的命令列表,而且我不知道如何以有效的方式实现它。我正在考虑创建一个Map并使用字符串作为键,然后使用CALLBACK *作为指针的相应函数。但是之后我还要把它投出去。我主要是一个Java程序员,而不是最好的C ++程序员,所以我不确定这个Map的想法是否会起作用或者最后如何处理演员。另外,我查看了维基百科上的Command模式,但不知道在这种情况下如何实现。
答案 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)