Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 哪种设计模式最适合避免方法中的多个参数_Java_Design Patterns - Fatal编程技术网

Java 哪种设计模式最适合避免方法中的多个参数

Java 哪种设计模式最适合避免方法中的多个参数,java,design-patterns,Java,Design Patterns,我有以下课程: public class SomeAssebler { private EnrichedRequest assembleBasicEnrichedRequest(BasicRequest request) { EnrichedRequest enrichedRequest = new EnrichedRequest(); if (request != null) { enrichedRequest.setId(re

我有以下课程:

public class SomeAssebler {

    private EnrichedRequest assembleBasicEnrichedRequest(BasicRequest request) {
        EnrichedRequest enrichedRequest = new EnrichedRequest();
        if (request != null) {
            enrichedRequest.setId(request.getId());
            enrichedRequest.setDate(request.getDate());
            enrichedRequest.setParam(request.getParam());
        }
        return enrichedRequest;
    }

    private static EnrichedRequest assembleGeoDataEnrichedRequest(EnrichedRequest request, GeoData geoData) {
        EnrichedRequest geoEnrichedRequest = Optional.ofNullable(request).orElse(new EnrichedRequest());
        if (geoData != null) {
            geoEnrichedRequest.setCity(geoData.getCity());
            geoEnrichedRequest.setCountryCode(geoData.getCountryCode());
        }
        return geoEnrichedRequest;
    }

    private static EnrichedRequest assembleUserAgentEnrichedRequest(EnrichedRequest request, UserAgentData userAgentData) {
        EnrichedRequest userAgentEnrichedRequest = Optional.ofNullable(request).orElse(new EnrichedRequest());
        if (userAgentData != null) {
            userAgentEnrichedRequest.setBrowser(userAgentData.getBrowserCode());
            userAgentEnrichedRequest.setOperatingSystem(userAgentData.getOsCode());
            userAgentEnrichedRequest.setManufacturer(userAgentData.getBrand());
        }
    }

    public static EnrichedRequest assembleEnrichedRequest(BasicRequest request, GeoData geoData, UserAgentData userAgentData) {
        EnrichedRequest enrichedRequest = assembleBasicEnrichedRequest(request);
        enrichedRequest = assembleGeoDataEnrichedRequest(enrichedRequest, geoData);
        enrichedRequest = assembleUserAgentEnrichedRequest(enrichedRequest, userAgentData);
        return enrichedRequest;
    }
}
然后在不同的变压器中调用: 在GeoDataTransformer中

new KeyValue<>(key, assembleEnrichedRequest(basicRequest, geoData, null))
newkeyValue(key,assembleEnrichedRequest(basicRequest,geoData,null))
在UserAgentTransformer中:

new KeyValue<>(key, assembleEnrichedRequest(enrichedRequest, null, userAgent))
newkeyValue(key,assembleEnrichedRequest(enrichedRequest,null,userAgent))
如果将来添加更多的“Enricher”,这可能会变得非常丑陋。 有人知道我怎样才能设计得更好吗?
我虽然想到了构建器设计模式,但我不确定。

您可以使用
构建器模式
,但您必须在代码中做一些更改

您可以从中进行检查,这将解释如何使用构建器模式以及它解决了什么问题。您可以尝试这样的方法创建
Builder
类有很多不同的方法

public static class EnrichedRequestBuilder() {
    private EnrichedRequest enrichedRequest:
    private BasicRequest basicRequest:
    private GeoData geoData;
    private UserAgentData userAgentData;

    public EnrichedRequestBuilder enrichedRequest(EnrichedRequest e) {
        this.enrichedRequest = e;
        return this;
    }

    public EnrichedRequestBuilder basicRequest(BasicRequest e) {
        this.basicRequest = e;
        return this;
    }

    public EnrichedRequestBuilder build() {
        return new EnrichedRequestBuilder(this);
    }


}

new EnrichedRequestBuilder().basicRequest(b).enrichedRequest(e).build();

我最终确实使用了Builder模式,毕竟,你是对的,有很多方法可以实现这个模式,我想这就是为什么我感到困惑的原因。我也做了一些不同于你的建议,但你帮助了正确的方向。