实现方法链接(流畅的界面)与模型类

时间:2016-01-14 10:46:59

标签: java model-view-controller java-8 fluent-interface method-chaining

如何在Web应用程序中实现模型类的方法链接?

我有干净的POJO模型类:

public class MyModel {
    private String property;

    public String getFirstProperty() {
        return property;
    }

    public void setFirstProperty(String firstProperty) {
        this.property = firstProperty + "blah blah";
    }

}

我想添加两种方法。我应该在哪里添加它们?

public MyModel doSomething(String something) {
    property += something + "blah";
    return this;
}

public MyModel doAntyhing(String antyhing) {
    property += antyhing + "blah blah";
    return this;
}

我想用他们这样的:

MyModel myModel = new MyModel();
myModel.doAntyhing("blah").doAntyhing("blah blah");

<小时/> 低于我糟糕,丑陋的解决方案。怎么做得更好?

第一种方式。简单方法,但对于模型类非常难看(它们应该是干净的,没有逻辑应用程序):

public class MyModel {
    private String property;

    public String getFirstProperty() {
        return property;
    }

    public void setFirstProperty(String firstProperty) {
        this.property = firstProperty;
    }

    public MyModel doSomething(String something) {
        property += something + "blah";
        return this;
    }

    public MyModel doAntyhing(String antyhing) {
        property += antyhing;
        return this;
    }
}

我想将这两个方法移到其他类。

public class LogicForMyModel {
    public MyModel doSomething(String something) {
        property += something + "blah";
        return this;
    }

    public MyModel doAntyhing(String antyhing) {
        property += antyhing + "blah blah";
        return this;
    }
}

但如何连接这两个类呢?也许我应该使用继承或接口?怎么样?

interface ILogicModel {
    public MyModel doSomethingLogic(String something);
    public MyModel doAntyhingLogic(String antyhing);
}

第二种方式。使用“构建器”(基于this的解决方案)。

public class MyModel {
    protected String property;

    public String getFirstProperty() {
        return property;
    }

    public void setFirstProperty(String firstProperty) {
        this.property = firstProperty;
    }

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

}

public class BuilderMyModel {
    private MyModel myModel;

    public BuilderMyModel(MyModel myModel) {
        this.myModel = myModel;
    }

    public BuilderMyModel doSomething(String something) {
        myModel.property += something + "blah";
        return this;
    }

    public BuilderMyModel doAntyhing(String antyhing) {
        myModel.property += antyhing + "blah blah";
        return this;
    }
}

然后我可以使用它(可能build()就像Java 8中的stream()):

MyModel myModel = new MyModel();
myModel.build().doAntyhing("blah").doAntyhing("blah blah");

这比第一次更好。但我必须使用方法build()。我想调用MyModel而不是Builder的方法(如C#中的LINQ)。

这是更好的方法吗?

第三。使用库fluent-interface-proxy。但我不想每天都使用外部库。否则就这样我必须像第二种方式一样使用构建方法。

1 个答案:

答案 0 :(得分:0)

您还可以创建一个功能界面,如下所示:

interface ModelModifier {
    void apply(MyModel model);
}

然后,实现一些你需要的修饰符:

static ModelModifier doSomething(String something) {
    return model -> model.setProperty(something + "blah");
}

static ModelModifier doAntyhing(String anything) {
    return model -> model.setAnything(anything);
}

并添加一个应用修饰符的方法,可能直接在MyModel类中添加:

void applyModifiers( ModelModifier ... modifiers) {
    Stream.of( modifiers ).forEach( m -> m.apply(this) );
}

现在,您可以致电

mymodel.applyModifiers( doSomething( "blah" ), doAnything( "blahblah") );

这不是方法链接,但它可以用来代替方法链接