我必须通过一系列步骤来处理请求。
例如:如果请求1到来,那么我必须应用step1,step2,step3,最后是step4,它将处理后的请求持久保存到数据库中。
我考虑实现模板设计模式,因为它解决了类似的问题。
当我开始实施设计模式时,由于逻辑上的复杂性,我突然发现很难实施。
让我解释一下要求:
请求->控制器-> run()
该请求将包含List<objects>
。
在run方法内部,将触发一系列操作。
request.parallelStream()
.map(step1 -> executeStep1.apply(step1))
.map(step2 -> executeStep2.apply(step2, action))
.map(step3 -> executeStep3.apply(step3, rules))
.map(step4 -> executeStep4.apply(step4))
.collect(Collectors.toList());
Function<String, List<PersonDto>> executeStep1= person-> {
return metaData.getMetaDataPerson(person);
};
BiFunction<List<PersonDto>, String, TransTemplateDTO> executeStep2= (metaData, action) -> {
return temlate.createTemplate(metaData, action);
};
现在,我们可以看到,我将
request
的第一个元素作为输入传递给step1(),然后对其进行处理,并将输出作为输入进一步传递给后续步骤。问题1:
到此为止,没有问题。但是需求突然改变了,现在我必须在步骤3中添加规则逻辑,即
executeStep3.apply(step3)
。step3接受2个参数,一个是step2的输出,第二个是List规则。
第三步应应用所有规则,并返回与规则相等的结果。
对于前。如果有3条规则,则step3应该返回3个对象的列表。
假设step3收到了10个项目的
PersonDto
列表和3个项目的规则列表,那么step3应该返回10 * 3 = 30个记录。同样,对于每个人,规则将根据命令而有所不同。
问题2:
在第3步中,我需要请求对象,以便可以使用值。
像这样:
.map(step3 -> executeStep3.apply(step3, rules, request))
哪些设计模式可以为您提供帮助?如何提供帮助?
最佳答案
您应该使用Chain of Responsibility设计模式
import java.util.ArrayList;
import java.util.List;
class PersonDto {
protected int id;
protected String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class ChainOfResponsibility {
protected List<Handler> handlers = new ArrayList<>();
public void addHandler(Handler handler) {
this.handlers.add(handler);
}
public void handle(PersonDto person) throws Exception {
for(Handler handler : handlers)
handler.handle(person);
}
public static interface Handler {
void handle(PersonDto person) throws Exception;
}
public static class ValidatePersonHandler implements Handler {
@Override
public void handle(PersonDto person) {
if(person.getName() == null)
throw new IllegalArgumentException("name can't be null");
}
}
public static class SetPersonIdHandler implements Handler {
@Override
public void handle(PersonDto person) {
person.setId(1);
}
}
public static class InsertPersonToDBHandler implements Handler {
@Override
public void handle(PersonDto person) {
// insert to db
System.out.println("insert person: " + person.getName() + " to db");
}
}
public static void main(String[] args) throws Exception {
ChainOfResponsibility chain = new ChainOfResponsibility();
chain.addHandler(new ValidatePersonHandler());
chain.addHandler(new SetPersonIdHandler());
chain.addHandler(new InsertPersonToDBHandler());
PersonDto person = new PersonDto();
person.setName("foo");
chain.handle(person);
}
}
关于java - 使用Java 8的设计模式建议/实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59451266/