java - 以编程方式对不同的类进行分组和类型提示

标签 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 构建,它由特定的 RequestPerformer 表示。所以他们需要兼容。我现在已经摆弄过这种结构的泛型类型,即有一个 TypeInterface HttpSearcher 的构造函数的两个参数都应该实现,但我没有让它工作...另一种方法是只在一个类中实现检查(如果另一个类与之兼容),但这看起来很难看。

有什么方法可以通过它们处理的 API 来实现这样一组 RequestPerformerParser 吗?还是架构本身有问题?

最佳答案

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

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

关于java - 以编程方式对不同的类进行分组和类型提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41514957/

相关文章:

Java 递归传值

Java OOP 传递 'inner' 字段

java - 如何在Map.Entry中使用泛型方法参数?

c# - 如何将 LinqToSql Table<TEntity> 转换为 Table<IEntity> where TEntity : IEntity?

java - OutOfMemoryError 和 ObservableList 进入 ComboBox 的问题

java - 如何在 Java FileOutputStream 中写入新行

java - 无法加载 JDBC 驱动程序类 'com.mysql.jdbc.Driver' Tomcat 8 和 Eclipse

c++ - 不要在类内部使用类成员函数

java - 如何修复此绑定(bind)不匹配错误?

java - 在对象列表的 for 循环中使用 SimpleDateFormat