gpt4 book ai didi

java - 覆盖一个方法与多次实现它

转载 作者:搜寻专家 更新时间:2023-11-01 02:15:36 25 4
gpt4 key购买 nike

假设我有一个从网络下载新闻源的类

public class NewsDownloader {
public String downloadNewsFast() {
// download a news feed using a wifi connection
}

public String downloadNewsNormal() {
// download a news feed using a 3g connection
}

public String downloadNewsSlow() {
// download a news feed using a GPRS connection
}
}

在上述情况下,有 3 种下载新闻的方法,具体取决于可用的连接。如您所见,上述类定义了 3 个方法(我知道重新定义一个方法适用于继承情况下的静态方法)。

如果 NewsDownloader 的客户端像这样根据可用连接有条件地调用下载方法

public class NewsReader {
NewsDownloader n = new NewsDownloader();

public void getLatestNews(Connection c) {
if (c.getType().equals("Wifi")) {
n.downloadNewsFast();
}
else if (c.getType.equals("3g")) {
n.downloadNewsNormal();
}
else {
n.downloadNewsSlow();
}
}
}

我的问题是双重的

  1. 我在设计 NewsDownloader 时会遇到什么问题,而不是使用工厂模式等更抽象的方法?
  2. 采用更抽象的 NewsDownloader 设计,NewsReader 有什么好处(如果有的话)?

我已经阅读了工厂方法和抽象工厂模式的好处,并为了自己的利益而实现了它们。但是,我看不出上述方法与工厂模式之间的区别。

我希望人们不要将此视为拖钓!我只是想阐明抽象设计为我正在撰写的项目解决的问题

最佳答案

我不确定您想要将事物抽象化的原因是什么。一般规则:

  • 抽象类是为了代码重用
  • 接口(interface)定义契约
  • 应用控制反转原则,工厂模式有时可以帮助实现这一点

按照这些准则,我认为没有立即理由考虑为 NewsDownloader 创建一个抽象类,因为只有其中一个。您可以将它作为一个接口(interface)而不是一个类来松开耦合,我认为这是您询问的好处。最后,NewsReader 不应该实例化它自己的 NewsDownloader,而是依赖于它以某种方式被注入(inject)。

更新: TofuBeer's answer在代码中很好地阐述了这些原则。

关于java - 覆盖一个方法与多次实现它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7052391/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com