鉴于我有一个使用某种类型的搜索器来获取并显示URL列表的类,如下所示:
package com.acme.displayer;
import com.acme.searcher.SearcherInterface;
class AcmeDisplayer {
private SearcherInterface searcher;
public AcmeDisplayer(SearcherInterface searcher) {
this.searcher = searcher;
}
public void display() {
List<String> urls = searcher.getUrls();
for (String url : urls) {
System.out.println(url);
}
}
}
而SearcherInterface
看起来如下:
package com.acme.searcher;
public interface SearcherInterface {
List<String> getUrls();
}
这些搜索器有多种实现方式。 (例如,一个仅出于测试目的返回String
的硬编码列表)。
但是,另一个,对任何API执行HTTP请求并解析URL的响应,如下所示:
package com.acme.searcher.http;
import com.acme.searcher.SearcherInterface;
public class HttpSearcher implements SearcherInterface {
private RequestPerformerInterface requestPerformer;
private ParserInterface parser;
public HttpSearcher(RequestPerformerInterface requestPerformer, ParserInterface parser) {
this.requestPerformer = requestPerformer;
this.parser = parser;
}
List<String> getUrls() {
InputStream stream = requestPerformer.performRequest();
return parser.parse(stream);
}
}
由于关注点的分离,所以完成了这样的HTTP请求的拆分。
但是,这导致了一个问题:Parser
可能仅针对由某个RequestPerformer
表示的某个API构建。因此,它们需要兼容。我现在在弄弄这种结构的泛型类型,即具有TypeInterface
,而HttpSearcher
s构造函数的两个参数都应实现,但我没有使它起作用。另一种方法是仅实现检查一个类是否与另一个类兼容,但这看起来很丑。
是否有任何方法可以通过它们正在处理的API来实现RequestPerformer
和Parser
的分组?还是架构本身有问题?
您的HttpSearcher
似乎是将这2个分组在一起的设备。您可以创建一个返回HttpSearcher
和其他类似类的工厂类,并对该工厂进行编码以将兼容的RequestPerformer
和Parser
组合在一起。
我不建议使用字体系统的原因,例如通过泛型,是InputStream
类型不能保证其保存的数据的格式/类型。分离获取原始数据和解析的责任似乎是个好主意,但是您仍然必须“手动”将兼容类型分组在一起,因为只有您知道InputStream
将保存哪种数据格式/类型。 >