我正在寻找一种可以替换库的方法。 例如:我有一个管理多播通信的库。我在我的主应用程序中使用该库。我的想法是使用一个接口:
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)
有什么想法吗?
答案 0 :(得分:3)
这是一个基本的插件系统。你应该做的是:
注意,有更复杂的方法可以在java中加载插件(例如使用java.util.ServiceLoader和/或嵌套的类加载器),但这是一个好的开始。
答案 1 :(得分:0)
您使用库接口,不要将它们放在两者上。库正在定义用于与之通信的接口。
在您希望使用库接口编程的主应用程序中,您可以切换到不同的实现,而无需更改代码,只需实现。
答案 2 :(得分:0)
有几种解决方案,但是(将接口设置为库或者 将接口放在自己的库中,但是你需要有一个名字 用于接口,例如com.messaging.MessageHandler。
答案 3 :(得分:0)
策略模式可以在这里提供帮助。
如果您希望库可以替换,请定义策略 封装了这个库的功能。
代码中的任何地方,只需调用策略, 不是图书馆。然后该战略将选择哪个 要走的路。
完成后,您可以替换封装的策略 与任何其他战略或图书馆。
答案 4 :(得分:0)
您可以使用DI。您将通过您最喜欢的DI实现注入实现。
答案 5 :(得分:0)
这个问题是“回答”但无论如何,我想给你带来另一种观点。
您应该研究OSGi和服务模块化,以实现无缝替换相同服务逻辑的实现。 OSGi强烈强制实现接口和实现的分离,并提供具有“捆绑”的模块化体系结构,甚至可以在运行时(重新)部署。
您可以使用MulticastMessageHandler作为实现的“MessageHandler”服务。
我们有例如具有可切换noSQL和SQL数据存储区作为后端的数据存储。该应用程序从未注意到/不使用哪一个。
Eclipse有Equinox OSGi,它包含在您的Eclipse开发环境中。