【问题标题】:How can a Plugin call Other Plugins with C++?插件如何使用 C++ 调用其他插件?
【发布时间】:2018-01-11 12:38:54
【问题描述】:

这是一个基于工厂模式的插件系统。 每个插件都扩展了Plugin 类并实现了一个工厂,将扩展的类返回给内核。

插件被编译为共享库。内核检查plugins/ 目录并在运行时加载所有库。 当点击红色按钮时,内核会在每个加载的插件上调用call_on_red_click()

// Plugin.h
class Plugin {
public:
    virtual void call_on_blue_click() = 0;
    virtual void call_on_red_click() = 0;
}

// MyPlugin.h
class MyPlugin : public Plugin {
public:
    void call_on_blue_click() {/*[...]*/}
    void call_on_red_click() {
        // Does something
        // Optionaly, activate teleporter
    }
}

Plugin *plug_factory() { return new MyPlugin; }

// MyOtherPlugin.h
class MyOtherPlugin : public Plugin {
public:
    void call_on_blue_click() {/*[...]*/}
    void call_on_red_click() {
        // Does something else
        // Optionaly, activate teleporter
    }
}

Plugin *plug_factory() { return new MyOtherPlugin; }

传送器是单独编译的,可能不会出现在每个安装中(它是自己发货的)。 假设 MyPlugin 和 MyOtherPlugin 想要激活传送器如果它存在。

问题:

  1. Teleporter 应该是内核插件还是其他东西?
  2. 有这方面的设计模式吗?

【问题讨论】:

  • 这将取决于您的平台,因此将被选为题外话。标记 O/S 和/或跨平台框架以获取更具体的信息。应该有一个 API 可以在某处手动加载 dll。如果你的 dll 只导出一个对象工厂,那么脏代码的数量就会减少。如果实际实现不可用,您可以轻松地使用对象的存根实现,或者如果您想在应用程序处于活动状态而不是启动时切换,则可以对实际实现使用 pimpl。

标签: c++ design-patterns plugins factory-pattern


【解决方案1】:

听起来你想要decorator pattern

这将允许您拥有一个加载 dll 的类,然后您的插件可以查询您的装饰器(如果启用了传送)。然后,您可以出于任何原因禁用它,而不仅仅是因为 dll 不存在;或者即使 dll 不存在但以其他方式实现也启用它。

【讨论】:

    猜你喜欢
    • 2010-11-17
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多