我正在设计一个利用异步HTTP下载的应用程序。我希望这个应用程序能在Android、Windows桌面和Mac桌面上工作,这就是为什么我要用Java开发它,并试图使它非常模块化。

(为了清晰起见,我使用的库是AsyncHttpClient和Android-异步-Http)
我已经有了库来处理下载,但问题是核心模块中的特定方法必须能够执行下载功能,而不管使用什么库。我对该做什么有两个想法。
GenericDownloader的抽象类,并在特定的应用程序中使用AndroidDownloader这样的类对其进行扩展。DownloadInterface的接口,以类似于Idea 1的方式在特定的应用程序中实现它。这两种思想的问题在于,我无法实例化抽象类或接口,那么如何在核心中实现功能呢?
我还能怎么解决这个问题呢?
发布于 2012-12-05 04:02:23
首先,是否使用接口或抽象基类是一个核心是否能够并且应该为下载器的实现提供功能的问题。如果它不能,或者不应该,不要使用抽象基类。与抽象基类相比,更喜欢接口。即使可以,也可以考虑提供一个单独的类来提供实现可以使用的功能。更喜欢封装而不是继承。
你的具体问题的答案是,“视情况而定”。一般来说,您需要一些方法来告诉核心关于它在运行时可用的实现。
根据打包方式的不同,它可能很简单,核心中有一个加载器工厂方法,它依次使用Class.forName()查找每个实现,直到找到一个;这假设您用每个分布式JAR打包了一个实现。
否则,它可能会在某个地方使用配置条目来指定实现的类名;同样,反射用于查找类。
否则,您可以使用反射并在类路径中搜索实现接口的类。
否则,您可以使用java.net.URLClassLoader动态创建类路径并动态加载类。
发布于 2012-12-05 03:19:31
尝试
有一个执行实际下载的具体类(在核心中)。这不是GenericDownloader抽象类。
您的GenericDownloader类将包含此具体的下载器作为受保护的成员。然后,您的GenericDownloader类将成为一个事件侦听器,用于具体的下载程序需要它侦听的东西(完成、IOError等)。您将需要创建这些侦听器函数。保护他们,因为你的孩子需要覆盖他们。
现在,在您的子类中,您将覆盖来自GenericDownloader的那些“虚拟”事件侦听器函数,记住在它们中调用super.someDowloadEventHandler(.)。这些重写中的其他内容将是您特定于平台的代码。请记住,您仍然可以从任何子节点访问具体的下载程序,以进行额外的操作。
不实例化抽象类。您只在抽象类的构造函数中实例化具体的下载器。因此,请记住在您的子类的构造函数中调用super()。
现在,很多人从一个项目中引用正确的库,然后实例化AndroidDownloader的实例,如果您正在使用Android、WindowsDownloader from等,那么它们中的任何一个都将具有内核的低级功能。
https://stackoverflow.com/questions/13705935
复制相似问题