【问题标题】:What design pattern elements to use for multiplatform HTTP?多平台 HTTP 使用哪些设计模式元素?
【发布时间】:2012-12-04 15:09:48
【问题描述】:

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

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

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

  • 想法 1:在 CORE 中放置一个名为 GenericDownloader 的抽象类,并使用 AndroidDownloader 等类在特定应用中扩展它。
  • 思路2:在CORE中放入一个名为DownloadInterface的接口,在具体的应用中实现,方法与思路1类似。

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

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

【问题讨论】:

标签: java oop design-patterns module polymorphism


【解决方案1】:

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

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

取决于你如何打包东西,它可能就像在核心中拥有一个加载器工厂方法一样简单,它依次使用Class.forName() 查找每个实现,直到找到一个;这假设您将一个实现与每个分布式 JAR 打包在一起。

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

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

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

【讨论】:

    【解决方案2】:

    尝试

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2019-01-25
      • 1970-01-01
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      • 2020-01-11
      相关资源
      最近更新 更多