用于修改方法返回值的模式

时间:2011-12-14 19:02:00

标签: java string design-patterns methods

我有一个为请求创建URL的函数,如下所示:

public String createUrl(String path, String filename) {
        return new StringBuilder(path).append("?filename=").append(filename).toString();
        }

现在,我想要做的是在URL中添加另一个名为transactionId的参数。一个天真的实现将是:

 public String createUrl(String path, String filename,String transactionId) {
            return new StringBuilder(path).append("?filename=").append(filename).append("?transactionId=").append(transactionId).toString();
            }

或者我可以在某个地方使用静态方法返回transactionID并按如下方式修改代码:

 public String createUrl(String path, String filename) {
            return new StringBuilder(path).append("?filename=").append(filename).append("?transactionId=").append(TransactionMonitor.getTransactionId()).toString();
            }

这两种方法都让我修改了预先存在的代码。有没有一种方法可以用新参数来装饰方法返回的url。此外,如果解决方案是可配置的,那将是很好的。

由于

1 个答案:

答案 0 :(得分:4)

您可以创建为您构建网址的UrlBuilder类:

class UrlBuilder {

    private String path;

    private Map<String, String> parameters = new LinkedHashMap<String, String>();

    public UrlBuilder path(String path) {
        this.path = path;
        return this;
    }

    public UrlBuilder parameter(String param, String value) {
        parameters.add(param, value);
        return this;
    }


    public String build() {
        String paramsString = "";

        for (Map.Entry<String, String> entry: parameters.entrySet()) {
            if (paramsString.isEmpty()) {
                paramsString += "?";
            }
            paramsString += params.getKey() + "=" + params.getValue();
        }

        return path + paramsString;
    }

}

并在您的代码中使用它

new UrlBuilder().path("http://google.com").params("q", "java").build()