我必须通过一系列步骤来处理请求。

例如:如果请求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/

10-11 00:54