我目前正在研究一个包含一组核心功能的Java应用程序,这个功能必须扩展到几个不同的目的(~10个不同的目的),因此,我想到的最佳解决方案是选项添加插件以在需要时扩展功能,而不是为每个插件提供不同的代码库。
这样做的最佳方法是创建一个接口并在相关插件中扩展它吗?
public coreCode()
{
// Core
doThis();
doThat();
// Call plugin code
plugin.doStuff();
}
// Plugin
public interface PluginInterface()
{
doStuff();
...
}
我已经研究过JSF等,但是由于工作限制(没有特定的授权等),遗憾的是它们不是一个可行的选择。
- 编辑 -
它应该大致如下:
目的A,B和C需要一组功能,因此为它们开发了plugin1,与它们捆绑在一起然后进行部署。目的D和E需要一个不同的集合,因此plugin2是为它们开发的,捆绑和部署。等
答案 0 :(得分:1)
对于插件,您可以创建一个特定目录,其中定位了实现某个接口或扩展某个抽象类的类文件。然后,您可以创建这些类的新实例,并查看它们是否是您希望它们的抽象类/接口的实例,然后创建它们的某个列表,并使用户能够启用/禁用它们。如果启用它们,则可以投射并执行它们。
答案 1 :(得分:0)
我建议你研究OSGi - 一个动态组件模型,其中应用程序被开发和部署为一组捆绑/插件,可以远程添加,启动,停止和删除,甚至不需要重启核心/主机应用程序。
您可以在Eclipse RCP平台(OSGi的最佳实现之一)上建模您的应用程序,并创建一个无头(没有任何UI)核心RCP应用程序。然后,所有其他应用程序功能将作为插件开发,即使在应用程序上线后,也可以以您喜欢的任何组合(或您的客户可能请求)捆绑或稍后添加到您的核心RCP应用程序。
如果您的应用程序具有UI并且您喜欢Eclipse IDE的外观和功能,例如“新项目”向导,则使用Perspectives来更改视图,工作区,上下文相关帮助功能的布局以及过度 - 通过插件存储库等进行网络更新,这绝对值得考虑。请查看此RCP FAQ页面,了解这是否符合您的需求。
唯一让开发人员失望的是它有一个陡峭的学习曲线。依赖关系总是用XML声明性地声明,并且在代码中所有组件都是如此解耦,以至于你总是发现自己更多地与框架交互。
使用JFace构建UI组件会给模型和视图之间的分离带来很大压力。因此,虽然所有这些都转化为良好的应用程序设计,但如果对框架不熟悉则不允许快速应用程序开发。其他大多数复杂问题都来自于RCP只提供了很多东西。