你可以使用
the strategy pattern.
每个条件都可以建模为一个函数,它接收一个帖子和一个会话,并可能返回一个错误:
Post -> PostContext -> Optional
您可以使用界面表示:
@FunctionalInterface
public interface ValidationCondition {
Optional validate(final Post post, final Session session);
}
例如:
public class CreatorValidation implements ValidationCondition {
public Optional validate(final Post post, final Session session) {
if (post.getCreator().equals(session.getUser()) {
return Optional.empty();
}
return Optional.of("You should be the owner of the post");
}
}
然后,您可以将每个验证存储在列表中:
final List conditions = new ArrayList<>();
conditions.add(new CreatorValidation());
conditions.add(new ScoreValidation());
// etc.
使用该列表,可以批量应用验证:
final List errors = new ArrayList<>();
for (final ValidationCondition condition : conditions) {
final Optional error = condition.validate(post, session);
if (error.isPresent()) {
errors.add(error.get());
}
}
使用Java 8 lambdas,您可以声明这些内联:
final ValidationCondition condition = (post, session) -> {
// Custom logic
});