如何在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。但我不想每天都使用外部库。否则就这样我必须像第二种方式一样使用构建方法。
答案 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") );
这不是方法链接,但它可以用来代替方法链接