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

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

现在应该可以更改库了。例如,正在管理广播通信的图书馆。两者都实现相同的接口。

因此,在我的主应用程序中,我希望有机会:
MessageHandler mHandler = new MulticastImpl();

要么
MessageHandler mHandler = new BroadcastImpl();

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

有任何想法吗?

最佳答案

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

  • 将插件API放在独立的jar中。
  • 在主应用程序中包含此插件API jar。
  • 插件实现不应包含插件API(它们只会将其用于编译)。
  • 为用户提供一种为插件指定“实现”类的方式(作为配置字符串)
  • 在应用程序启动时,使用反射从配置中加载实现类。

  • 请注意,有更复杂的方式可以在Java中加载插件(例如,使用java.util.ServiceLoader和/或嵌套的类加载器),但这是一个好的开始。

    10-08 01:12