如何在java中替换库?

时间:2012-07-21 13:56:16

标签: java eclipse architecture interface module

我正在寻找一种可以替换库的方法。 例如:我有一个管理多播通信的库。我在我的主应用程序中使用该库。我的想法是使用一个接口:

public interface MessageHandler {
    public void sendMessage();
    public Message receiveMessage();
}

现在应该可以更改库。例如,管理通过广播进行通信的库。两者都在实现相同的界面。

因此,在我的主要应用程序中,我希望有机会:

MessageHandler mHandler = new MulticastImpl();

或者

MessageHandler mHandler = new BroadcastImpl();

我的问题是:我在哪里放置接口定义?当我将它放入我的主应用程序时,我无法从库中看到它(因为库不知道主应用程序)。 当我将它放入两个库时,我有两个不同的MessageHandler-Interfaces(例如com.multicast.MessageHandler和com.broadcast.MessageHandler)

有什么想法吗?

6 个答案:

答案 0 :(得分:3)

这是一个基本的插件系统。你应该做的是:

  1. 将插件API放在一个独立的jar中。
  2. 在主应用程序中包含此插件API jar。
  3. 插件实现应该包含插件API(他们只会用它来编译)。
  4. 为用户提供了一种为插件指定“实现”类的方法(作为配置字符串)
  5. 在应用程序启动时,使用反射从配置中加载实现类。
  6. 注意,有更复杂的方法可以在java中加载插件(例如使用java.util.ServiceLoader和/或嵌套的类加载器),但这是一个好的开始。

答案 1 :(得分:0)

您使用库接口,不要将它们放在两者上。库正在定义用于与之通信的接口。

在您希望使用库接口编程的主应用程序中,您可以切换到不同的实现,而无需更改代码,只需实现。

答案 2 :(得分:0)

有几种解决方案,但是(将接口设置为库或者 将接口放在自己的库中,但是你需要有一个名字 用于接口,例如com.messaging.MessageHandler。

答案 3 :(得分:0)

策略模式可以在这里提供帮助。

如果您希望库可以替换,请定义策略 封装了这个库的功能。

代码中的任何地方,只需调用策略, 不是图书馆。然后该战略将选择哪个 要走的路。

完成后,您可以替换封装的策略 与任何其他战略或图书馆。

More information on Strategy pattern

答案 4 :(得分:0)

您可以使用DI。您将通过您最喜欢的DI实现注入实现。

答案 5 :(得分:0)

这个问题是“回答”但无论如何,我想给你带来另一种观点。

您应该研究OSGi和服务模块化,以实现无缝替换相同服务逻辑的实现。 OSGi强烈强制实现接口和实现的分离,并提供具有“捆绑”的模块化体系结构,甚至可以在运行时(重新)部署。

您可以使用MulticastMessageHandler作为实现的“MessageHandler”服务。

我们有例如具有可切换noSQL和SQL数据存储区作为后端的数据存储。该应用程序从未注意到/不使用哪一个。

Eclipse有Equinox OSGi,它包含在您的Eclipse开发环境中。