[英]What design pattern elements to use for multiplatform HTTP?
我正在设计一个使用异步HTTP下载的应用程序。 我希望该应用程序可以在Android,Windows桌面和Mac OS桌面上运行,这就是为什么我使用Java开发它并尝试使其具有高度模块化的原因。
(为清楚起见,Im使用的库是AsyncHttpClient和Android-Async-Http )
我已经具有处理下载的库,但是问题是,无论使用什么库,CORE模块中的特定方法都必须能够执行下载功能。 我对做什么有两个想法。
GenericDownloader
的抽象类,并将其扩展到具有AndroidDownloader
类的特定应用程序中。 DownloadInterface
的接口,以类似于想法1的方式在特定应用中实现它。 这两个想法的问题在于,我无法实例化抽象类或接口,那么如何在CORE中实现功能?
我还能如何解决这个问题?
尝试
有一个具体的类可以进行实际下载(在CORE中)。 这不是GenericDownloader抽象类。
您的GenericDownloader类将包含此具体下载器作为受保护的成员。 然后,您的GenericDownloader类将成为事件侦听器,以监听具体下载器需要侦听的所有事件(完整,IOError等)。 您将需要创建这些侦听器功能。 保护他们,因为您的孩子将需要超越他们。
现在,在子类中,您将覆盖GenericDownloader中的“虚拟”事件侦听器函数,并在其中记住要调用的super.someDowloadEventHandler(...)。 这些替代中的其他任何内容都将是您特定于平台的代码。 请记住,您仍然可以从任何子级访问具体的下载器以进行其他操作。
您没有实例化抽象类。 您只能在抽象类的构造函数中实例化具体的下载器。 因此,请记住在子类的构造函数中调用super()。
现在,您中的许多人都引用了项目中的正确库,如果您使用的是Android,WindowsDownloader for Windows等,则实例化AndroidDownloader实例。它们中的任何一个都具有CORE的较低级功能。
首先,是否使用接口或抽象基类是核心是否可以并且应该为下载器的实现提供功能的问题。 如果不能,或者不应该,则不要使用抽象基类。 首选接口胜于抽象基类。 即使可以,请考虑提供一个单独的类来提供实现可以使用的功能。 封装优先于继承。
您的特定问题的答案是,“取决于”。 一般来说,您需要某种方式在运行时告诉内核有关其可用的实现的信息。
根据您对事物进行打包的方式,可能很简单,即在内核中使用一个加载器工厂方法,该方法依次使用Class.forName()
查找每个实现,直到找到一个为止。 这假定您将每个分布式JAR打包为一个实现。
否则,它可能会在某处使用配置条目来指定实现的类名; 再次使用反射来查找类。
否则,您可以使用反射并搜索类路径以查找实现您的接口的类。
否则,您可以使用java.net.URLClassLoader
即时创建类路径并使用它动态加载类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.