java - 代码设计使以后添加类似任务变得容易

标签 java oop design-patterns

例如,我有一个可以下载视频的应用程序。由于下载任务相似,我创建了一个下载基类。

public abstract class Download {
  public abstract void run();
}

对于每个可以下载视频的具体网站,我从基类创建一个子类:

public class DownloadYouTube extends Download {
  public void run() {
  }
}

public class DownloadVimeo() extends Download {
  public void run() {
  }
}

为了查看用户想从哪个站点下载,我创建了一个枚举并在其中切换以创建正确的对象,然后调用通用方法 run()。

public enum WEBSITE {
  YOUTUBE,
  VIMEO
}

public void startDownload(WEBSITE website) {
  Download download;
  switch (website) {
    case YOUTUBE:
      download = new DownloadYoutube();
      break;
    case VIMEO:
      download = new DownloadVimeo();
      break;
  }
  download.run();
}

以后其他人可能想要添加新网站。使用该设计并不容易。人们必须在三个地方进行编辑:他们必须改变枚举,他们必须添加一个新的案例,他们必须自己编写类。

如果只编写类会好得多。

是否有任何通用的代码设计或其他建议可以比这更好地处理这种情况?

最佳答案

作为一种可能的解决方案,您可以将抽象工厂方法添加到您的枚举中,这将创建一个必要的 Download 对象。 所以 WEBSITE 不仅成为您支持的网站列表,而且还封装了每个网站的行为:

public enum WEBSITE {
    YOUTUBE {
        @Override
        public Download createDownload() {
            return new DownloadYouTube();
        }
    },
    VIMEO {
        @Override
        public Download createDownload() {
            return new DownloadVimeo();
        }
    };

    public abstract Download createDownload(); 
}

public void startDownload(WEBSITE website) {
    website.createDownload().run();
}

使用这种方法,如果不定义应如何处理,就不可能添加新的 WEBSITE

关于java - 代码设计使以后添加类似任务变得容易,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44531591/

相关文章:

java - 用于匹配注释字段上的公共(public)方法调用的 Aspectj 切入点

OSGi 上的 java.lang.NoClassDefFoundError

php - 如何在不冲突的情况下在另一个 PHP Trait 中使用 PHP Trait?

带有 Objective C 示例的 iOS 模式,用于防止对方法的并发调用

java - 类类型变量或在构造函数/方法中实例化之间有什么区别

java - 我想清理我的 if-else 逻辑

java - 以下哪一段代码在 Java 中速度更快

Python 使用类方法/静态方法登录类

java - 什么时候将实例变量设为私有(private)?

Python - 如何实现桥(或适配器)设计模式?