Java 多平台HTTP使用什么设计模式元素?
我正在设计一个利用异步HTTP下载的应用程序。我希望这个应用程序能在Android、Windows桌面和Mac OS桌面上运行,这就是为什么我要用Java开发它,并试图使它非常模块化 (为清晰起见进行编辑,我使用的库是和) 我已经有库来处理下载,但问题是核心模块中的特定方法必须能够执行下载功能,而不管使用的是什么库。我有两个关于做什么的想法Java 多平台HTTP使用什么设计模式元素?,java,oop,design-patterns,module,polymorphism,Java,Oop,Design Patterns,Module,Polymorphism,我正在设计一个利用异步HTTP下载的应用程序。我希望这个应用程序能在Android、Windows桌面和Mac OS桌面上运行,这就是为什么我要用Java开发它,并试图使它非常模块化 (为清晰起见进行编辑,我使用的库是和) 我已经有库来处理下载,但问题是核心模块中的特定方法必须能够执行下载功能,而不管使用的是什么库。我有两个关于做什么的想法 想法1:将一个名为GenericDownloader的抽象类放在核心中,并使用AndroidDownloader之类的类在特定的应用程序中进行扩展 想法
- 想法1:将一个名为
的抽象类放在核心中,并使用GenericDownloader
之类的类在特定的应用程序中进行扩展AndroidDownloader
- 想法2:在CORE中放置一个名为
的接口,以与想法1类似的方式在特定应用程序中实现它DownloadInterface
我还可以如何解决此问题?尝试 有一个具体的类来进行实际的下载(在核心中)。这不是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他不能,因为这是不可能的。如果不提供所有抽象方法的实现,则无法实例化抽象类或接口。这就是为什么它被称为抽象。