Реализуйте правила как цепочку ответственности:
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);