如何在Java中实现可替换的库?

3

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

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

现在可以更改库了。例如,一个管理广播通信的库。两个库都实现了相同的接口。
因此,在我的主应用程序中,我希望有以下机会:
MessageHandler mHandler = new MulticastImpl();

或者

MessageHandler mHandler = new BroadcastImpl();

我的问题是:接口定义应该放在哪里?如果我把它放到主应用程序中,库就看不见它了(因为库不知道主应用程序)。如果我把它放到两个库中,我就会有两个不同的MessageHandler-Interface(例如com.multicast.MessageHandler和com.broadcast.MessageHandler)。
有什么建议吗?
6个回答

3
这是一个基本的插件系统,你需要做的是:
  1. 将插件API放在一个独立的jar包中。
  2. 在主应用程序中包含此插件API jar包。
  3. 插件实现不应包括插件API(它们只会在编译时使用它)。
  4. 提供一种方式让用户指定插件的“实现”类(作为配置字符串)。
  5. 在应用程序启动时,使用反射从配置中加载实现类。
请注意,Java中还有更复杂的加载插件的方法(例如使用java.util.ServiceLoader和/或嵌套类加载器),但这是一个很好的开始。

0

你使用库接口时,不要同时放置它们。库定义了用于与其通信的接口。

在你的主应用程序中,你想要使用库接口进行编程,然后你可以切换到不同的实现而无需更改代码,只需更改实现即可。


0

有几种解决方案,但是(将接口放在两个库中或将接口放在自己的库中),但您需要为接口指定一个名称,例如com.messaging.MessageHandler。


0

策略模式可以在这里发挥作用。

如果你想让一个库可替换,定义一个策略来封装这个库所做的事情。

在你的代码中,只需调用策略,而不是库。策略将选择哪种方式去执行。

完成后,您可以使用任何其他策略或库替换封装的策略。

有关策略模式的更多信息


0

您可以使用DI来实现此功能。您可以通过您喜欢的 DI 实现来注入该实现。


0

这个问题已经“回答”了,但是我想给你带来另一个视角。

你应该研究OSGi和服务模块化作为实现同一服务逻辑的无缝替换的方法。OSGi强制分离接口和实现,并提供了一个具有“捆绑包”的模块化架构,甚至可以在运行时重新部署。

你可以拥有一个“MessageHandler”服务,其中MulticastMessageHandler是一种实现方式。

例如,我们有一个数据存储器,它具有可切换的noSQL和SQL数据存储器作为后端。应用程序永远不会注意到/不关心使用哪一个。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接