2

我正在设计一个使用异步 HTTP 下载的应用程序。我希望这个应用程序可以在 Android、Windows 桌面和 Mac OS 桌面上运行,这就是我用 Java 开发它并尝试使其非常模块化的原因。

在此处输入图像描述

(为清楚起见进行编辑,我使用的库是AsyncHttpClientAndroid-Async-Http

我已经有库来处理下载,但问题是 CORE 模块中的特定方法必须能够执行下载功能,而不管使用什么库。我对该怎么做有两个想法。

  • 想法 1:在 CORE 中调用一个抽象类GenericDownloader,并在特定的应用程序中扩展它,例如AndroidDownloader.
  • 思路2:在CORE中调用一个接口DownloadInterface,在具体的应用程序中实现,类似于思路1。

这两个想法的问题是我无法实例化抽象类或接口,那么如何在 CORE 中实现功能呢?

我还能如何解决这个问题?

4

2 回答 2

0

试图

有一个执行实际下载的具体类(在 CORE 中)。这不是 GenericDownloader 抽象类。

您的 GenericDownloader 类将包含这个具体的下载器作为受保护的成员。然后,您的 GenericDownloader 类将成为具体下载器需要监听的任何事件监听器(Complete、IOError 等)。您将需要创建这些侦听器函数。让它们受到保护,因为您的孩子需要覆盖它们。

现在,在您的子类中,您从 GenericDownloader 覆盖那些“虚拟”事件侦听器函数,记住在它们内部调用 super.someDowloadEventHandler(...)。这些覆盖中的其他内容将是您特定于平台的代码。请记住,您仍然可以从任何孩子访问具体下载器以进行其他操作。

您不实例化抽象类。您只需在抽象类的构造函数中实例化具体下载器。所以,记得在你的子类的构造函数中调用 super() 。

您现在从项目中引用了正确的库,然后实例化 AndroidDownloader 实例(如果您使用的是 Android、WindowsDownloader for Windows 等)。它们中的任何一个都将具有 CORE 的较低级别的功能。

于 2012-12-05T03:19:31.310 回答
0

首先,是否使用接口或抽象基类是核心是否能够并且应该为下载器的实现提供功能的问题。如果不能或不应该,请不要使用抽象基类。首选接口而不是抽象基类。即使可以,考虑提供一个单独的类来提供实现可以使用的功能。更喜欢封装而不是继承。

您的具体问题的答案是,“这取决于”。一般来说,您需要一些方法来告诉核心在运行时可用的实现。

根据您打包事物的方式,它可能就像在核心中拥有一个加载器工厂方法一样简单,该方法Class.forName()会依次查找每个实现,直到找到一个;这假设您将一个实现与每个分布式 JAR 打包在一起。

否则,它可能会在某处使用配置条目来指定实现的类名;再次反射用于查找类。

否则,您可以使用反射并搜索类路径以查找实现您的接口的类。

否则,您可以使用java.net.URLClassLoader动态创建类路径并使用它动态加载类。

于 2012-12-05T04:02:23.210 回答