gpt4 book ai didi

java - 用 Java 编写响应处理程序

转载 作者:行者123 更新时间:2023-12-04 17:53:32 24 4
gpt4 key购买 nike

我的服务调用下游服务,它返回一个 ResponseEntity<MyBodyClass> response .我的服务需要根据 response 的不同属性做出不同的 react

例如如果response.getStatusCode() == HttpStatus.BAD_REQUESTresponse.getBody().code == 1 ,服务应该执行一些操作“A”,但是如果对于相同的状态代码 response.getBody().id == 1 ,那么它应该做“B”。另一个例子是如果 response.getStatusCode() == HttpStatus.OKresponse.getBody() != null ,服务应该做“C”。

我知道这可以用一堆 if 语句来完成,但是有没有更好的设计模式?

最佳答案

将规则作为责任链实现:

ruleFoo -> ruleBar -> ruleFooBar -> ....

链必须根据规则优先级排序,链的每个元素(这里的规则)都经过处理以检测匹配。一旦规则匹配,规则就会执行适当的操作,链式过程就会停止。

这是一个非常简单的实现,它利用了 java 8 流(这与最初的 GOF 模式有点不同,但我喜欢它,因为它实现起来更轻松)。

public interface ResponseRule {        
boolean match(Response response);
void performAction();
}

public class RuleFoo implements ReponseRule {

public boolean match(Response response){
return response.getStatusCode() == HttpStatus.BAD_REQUEST && response.getBody().code == 1;
}

public void performAction(){
// do the action
}
}

public class RuleBar implements AbstractReponseRule {

public boolean match(Response response){
return response.getStatusCode() == HttpStatus.BAD_REQUEST && response.getBody() != null;
}

public void performAction(){
// do the action
}
}

以及如何使用它们:

Response response = ...;
List<ResponseRule> rules = new ArrayList<>();
rules.add(new RuleFoo(), new RuleBar());

rules.stream()
.filter(rule -> rule.match(response))
.findFirst()
.ifPresent(ResponseRule::performAction);

请注意,如果可以累积规则执行,则需要进行一些小改动:

rules.stream()
.filter(rule -> rule.match(response))
.forEachOrdered(ResponseRule::performAction);

关于java - 用 Java 编写响应处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60613232/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com