Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多平台HTTP使用什么设计模式元素?_Java_Oop_Design Patterns_Module_Polymorphism - Fatal编程技术网

Java 多平台HTTP使用什么设计模式元素?

Java 多平台HTTP使用什么设计模式元素?,java,oop,design-patterns,module,polymorphism,Java,Oop,Design Patterns,Module,Polymorphism,我正在设计一个利用异步HTTP下载的应用程序。我希望这个应用程序能在Android、Windows桌面和Mac OS桌面上运行,这就是为什么我要用Java开发它,并试图使它非常模块化 (为清晰起见进行编辑,我使用的库是和) 我已经有库来处理下载,但问题是核心模块中的特定方法必须能够执行下载功能,而不管使用的是什么库。我有两个关于做什么的想法 想法1:将一个名为GenericDownloader的抽象类放在核心中,并使用AndroidDownloader之类的类在特定的应用程序中进行扩展 想法

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

(为清晰起见进行编辑,我使用的库是和)

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

  • 想法1:将一个名为
    GenericDownloader
    的抽象类放在核心中,并使用
    AndroidDownloader
    之类的类在特定的应用程序中进行扩展
  • 想法2:在CORE中放置一个名为
    DownloadInterface
    的接口,以与想法1类似的方式在特定应用程序中实现它
这两种想法的问题在于我无法实例化抽象类或接口,因此如何在CORE中实现功能


我还可以如何解决此问题?

尝试

有一个具体的类来进行实际的下载(在核心中)。这不是GenericDownloader抽象类

您的GenericDownloader类将包含此具体的downloader作为受保护的成员。然后,您的GenericDownloader类将成为事件侦听器,具体的downloader需要侦听什么(Complete、IOError等)。您将需要创建这些侦听器函数。使它们受到保护,因为您的孩子需要覆盖它们

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

您不需要实例化抽象类。您只能在抽象类的构造函数中实例化具体的下载程序。因此,记住在子类的构造函数中调用super()


现在,您可以从一个项目中引用正确的库,然后实例化AndroidDownloader的实例(如果您使用Android、Windows Downloader for Windows等)。其中任何一个都将具有核心的较低级别功能。

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

你具体问题的答案是“视情况而定”。一般来说,您需要某种方法来告诉核心运行时可用的实现

根据打包方式的不同,它可能非常简单,比如在核心中有一个loader factory方法,该方法依次使用
Class.forName()
查找每个实现,直到找到一个;这假设您为每个分布式JAR打包一个实现

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

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


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

为什么不能实例化抽象类@阿特布里斯托尔:你能详细说明吗?@Dreen我说得比Martin Fowler好。@NarendraPathai他不能,因为这是不可能的。如果不提供所有抽象方法的实现,则无法实例化抽象类或接口。这就是为什么它被称为抽象。