Java 使用模型类实现方法链接(fluent接口)的最佳方法
如何在web应用程序中实现模型类的方法链接 我有干净的POJO模型课:Java 使用模型类实现方法链接(fluent接口)的最佳方法,java,model-view-controller,java-8,fluent-interface,method-chaining,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 = firstProp
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");
void applyModifiers( ModelModifier ... modifiers) {
Stream.of( modifiers ).forEach( m -> m.apply(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);
}
第二种方法。使用“构建器”(基于的解决方案) 然后我可以使用它(可能build()与Java 8中的stream()类似): 这比第一次更好。但我必须使用build()方法。我想为MyModel而不是Builder调用方法(如C#中的LINQ) 这是做得更好的方法吗
第三个。使用库。但我不想每天都使用外部库。否则,以这种方式,我必须使用第二种方式构建的方法 您还可以创建如下功能界面:
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类中,如下所示:
MyModel myModel = new MyModel();
myModel.doAntyhing("blah").doAntyhing("blah blah");
void applyModifiers( ModelModifier ... modifiers) {
Stream.of( modifiers ).forEach( m -> m.apply(this) );
}
现在,你可以打电话了
mymodel.applyModifiers( doSomething( "blah" ), doAnything( "blahblah") );
它并不完全是方法链接,但可以使用它来代替方法链接仅当这些方法实际上用于构建模型对象时,才应使用builder。也许你应该给我们提供更多关于这些方法的内容。这是一个具有模型属性之一的简单操作吗?这是商业逻辑吗?我看不出有什么值得讨论的。在一种情况下,您在一个类中实现了某种逻辑,在第二种情况下,您在两个类中实现了相同的逻辑。逻辑没有改变,因此两个变体都不比另一个好。如果您真的认为,一个类中的方法数量很重要(比类的数量更重要),那么,将方法分布到两个或多个类上。如果不行,那就随你的便。没有真正的区别。
doSomething
/doAnything
方法应该是静态的,以便像这样使用(使用静态导入)。另外,由于您的apply()
方法具有void
返回类型,因此应该删除return null
。@didierr您完全正确,我修复了这个问题
mymodel.applyModifiers( doSomething( "blah" ), doAnything( "blahblah") );