使用插件更改C ++应用程序中的默认行为[关闭]
题
简而言之:设计和实现工厂+插件机制的最佳方法是什么,以便插件可以替换主应用程序中的对象。
我们有一个代码库,我们可以从中构建应用程序。代码库适用于70-95%的应用程序,这意味着在每个新应用程序中,我们需要更改5-30%的默认行为(添加新功能,更改默认逻辑,添加GUI等)。
该实现是基于插件的:代码库内置于EXE和DLL中,当主EXE运行时,我们加载了一个DLL,它添加了所需的功能。
目前,每个插件都公开以下功能:
PluginInterface* PluginInit()
{
return new MyCustomizedPluginInterface();
}
其中PluginInterface定义为:
class PluginInterface {
public:
virtual SomeClass1* customizedSomeClass1() = 0;
virtual SomeClass2* customizedSomeClass2() = 0;
};
SomeClass1 / SomeClass2有一些默认行为,但可以被插件覆盖和更改。
当前的实现使得添加新的自定义类变得困难。我们想从插件中替换主应用程序中的每个类,因此使用对象工厂是有意义的。
我知道的一个SDK使用以下技术:
PluginInterface* PluginInit(GodObject* godObject)
{
FactoryForSomeClasses* factoryForSomeClasses =
godObject->factoryForSomeClasses();
factoryForSomeClasses->setSomeClass1Creator( MyCustomizedSomeClass1::create); // create is a static creator function.
factoryForSomeClasses->setSomeClass2Creator( MyCustomizedSomeClass2::create);
}
我想知道这种方法是否有其他选择。
您如何推荐设计和实现我刚刚描述的插件系统/工厂?
解决方案
有一篇文章回到Dobb医生那里,讨论了这个确切的问题。以下是相关文章的链接。
另外,您可能希望坚持使用直接的C接口来插入项目。这样,您几乎可以轻松地将几乎任何语言编写的代码链接到您的框架中。虽然C ++很好,但是能够利用比C ++中存在的更多的东西,比如Java和Python领域中存在的令人难以置信的框架,从长远来看可能是有益的。
其他提示
您是否看过插件框架的CodeProject示例? https://secure.codeproject.com/KB/DLL/plugin.aspx http://www.codeproject.com/KB/library/dynobj.aspx
不隶属于 StackOverflow