繁体   English   中英

Java - 允许实现指定参数列表的接口

[英]Java - Interface to allow implementations to specify parameter list

我有这种情况,我想实施建议服务。 这应该是一种服务,用户可以调用它来检索某些已定义字段的建议值。 假设我想要关于汽车和手机的建议。 这些字段是固定的,因此我可以在服务接口中为每个字段硬编码一个方法。

但是,实际服务的实现应该可以自由地确定它如何检索这些建议。 它可能会查看一个文件,它可能会调用一个 Web 服务,等等。 为此,它还应该能够确定检索这些建议所需的参数。 有些实现可能需要更多信息,有些可能需要更少。 它返回的内容相同:某些实现可能返回单个值,而其他实现可能返回多个。

我想在服务的界面中体现这一点,所以我这样写:

public interface SuggestionService {
    SuggestionResult getCarSuggestion(final SuggestionCriteria criteria);
    SuggestionResult getMobilephoneSuggestion(final SuggestionCriteria criteria);
}

SuggestionResultSuggestionCriteria都是接口。 SuggestionService的实现可以使用他们自己的这两个接口的实现来正确地提供功能。 这对于返回类型非常有效,因为我可以在我的方法实现中缩小它们:

public class SuggestionServiceImpl implements SuggestionService {
    public CarSuggestionResult getCarSuggestion(final SuggestionCriteria criteria) {...}
    public MobilephoneSuggestionResult getMobilephoneSuggestion(final SuggestionCriteria criteria) {...}
}

问题是我无法更改参数类型。 如果我在SuggestionServiceImpl中这样做

public CarSuggestionResult getCarSuggestion(final CarSuggestionCriteria criteria) {...}

然后我得到一个编译错误。 这是有道理的,因为我现在通过减少允许的参数类型的数量来缩小我试图实现的接口。 出于充分的理由,这是不允许的。

但是,我觉得SuggestionServiceImpl应该能够告诉用户它实际需要哪些参数——通过在它的方法签名中指定它们。 这里有一个奇怪的利益冲突,我无法想出解决这个问题的解决方案。 一方面,我想编写和使用实际实现需要实现的接口。 通过这种方式,我可以确保所有实现都提供检索我感兴趣的字段的方法——在本例中为汽车和手机。 但是,实现接口应该能够准确地告诉用户它需要什么类型的参数,并且不接受任何通用参数列表,让用户传递正确的参数。 有没有办法把这两种欲望结合起来?

签名仍然是一个接口,没有要求它们都被同质化为看起来相似的调用。

public interface CarSuggester {
    Car getCarSuggestion(String param1);
}

public interface PhoneSuggester {
    List<Phone> getPhoneSuggestion(int param1, String param2);
}

public class SuggestionService implements CarSuggester, PhoneSuggester {
    ...
}

这让您可以使用简单的 Facade Pattern 保留(并测试)离散的建议器,以将它们组合成一个 impl(如果您也需要离散的 impl,则由您决定 - 建议它可能是明智的)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM