在 API 和软件核心之间交换变量
Exchange vars between API and software's core
我正在开发一个可以从JAR加载插件的截图软件。这些是使用 API 包开发的,它由接口来实现,因此想要制作插件的人不必使用完整的源代码。
这适用于添加类似操作(例如上传到 X 或 X 主机),但是如果我想以相反的方式发送变量,比如从插件到核心,该怎么办?我该怎么做?
我能想到的唯一解决方案是使用回调,但我觉得这不太干净...
顺便问一下,我使用开发人员实现的接口的解决方案是正确的吗?或者有更好的方法吗?
您的解决方案是实现此类场景的最常见方式。你给插件一个 class 的实例(由核心实例化),它们可以存储它以供将来使用(例如,将数据传递给核心或触发另一个动作)。通常这种 classes 的名称以 Context 结尾(例如 BundleContext、PluginContext 等)。
另一种模式是使用一种中介class。 class 带有一些静态方法,插件可以使用这些方法将一些数据发送到核心或触发一些动作。我不喜欢它,它不是一个非常干净的解决方案,但它使插件开发人员更容易访问 API,因为他们不需要存储上下文实例并尊重其生命周期。这种模式在 IntelliJ IDEA 架构中被广泛使用。
在您开发基于插件的系统时,我强烈建议您查看 OSGi 体系结构和 APIs。在这方面可能会有所帮助。
我正在开发一个可以从JAR加载插件的截图软件。这些是使用 API 包开发的,它由接口来实现,因此想要制作插件的人不必使用完整的源代码。
这适用于添加类似操作(例如上传到 X 或 X 主机),但是如果我想以相反的方式发送变量,比如从插件到核心,该怎么办?我该怎么做?
我能想到的唯一解决方案是使用回调,但我觉得这不太干净...
顺便问一下,我使用开发人员实现的接口的解决方案是正确的吗?或者有更好的方法吗?
您的解决方案是实现此类场景的最常见方式。你给插件一个 class 的实例(由核心实例化),它们可以存储它以供将来使用(例如,将数据传递给核心或触发另一个动作)。通常这种 classes 的名称以 Context 结尾(例如 BundleContext、PluginContext 等)。
另一种模式是使用一种中介class。 class 带有一些静态方法,插件可以使用这些方法将一些数据发送到核心或触发一些动作。我不喜欢它,它不是一个非常干净的解决方案,但它使插件开发人员更容易访问 API,因为他们不需要存储上下文实例并尊重其生命周期。这种模式在 IntelliJ IDEA 架构中被广泛使用。
在您开发基于插件的系统时,我强烈建议您查看 OSGi 体系结构和 APIs。在这方面可能会有所帮助。