例如,我有一个可以下载视频的应用程序。由于下载任务相似,我创建了一个下载基类。
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/