以编程方式对不同类进行分组和输入

时间:2017-01-06 21:53:40

标签: java oop generics architecture software-design

鉴于我有一个使用某种搜索器来获取和显示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可能只针对某个API构建,该API由某个RequestPerformer表示。所以他们需要兼容。我现在已经摆弄了这种结构的泛型类型,即TypeInterface HttpSearcher构造函数的两个参数都应该实现,但我没有让它工作......另一种方法是如果另一个类与它兼容,那么只需在一个类中实现一个检查,但这看起来很难看。

有没有办法通过他们正在处理的API实现RequestPerformerParser这样的分组?或者架构本身有什么问题吗?

1 个答案:

答案 0 :(得分:1)

您的HttpSearcher似乎就是将这两个组合在一起的设备。您可以创建一个返回HttpSearcher工厂类和其他类的工厂类,并编写工厂代码以将兼容的RequestPerformerParser组合在一起。

为什么我不建议利用类型系统,例如通过泛型,类型InputStream可以保证它所拥有的数据的格式/类型。分离获取原始数据和解析的责任似乎是一个好主意,但您仍然必须“手动”将兼容类型组合在一起,因为只有您知道InputStream将保留的数据格式/类型