我在考虑验证器的良好实现。我的服务方法是这样开始的:
if(badSituation()){
return Response.status(400).entity("bad situtaion").build();
}
if(badSituation2()){
return Response.status(400).entity("bad situtaion2").build();
}
...
if(badSituationN()){
return Response.status(400).entity("bad situtaionN").build();
}
由于验证器的速度非常快,我决定将它们重构为某种设计模式。我在考虑Chain of Responsibility
或Composite
,但是我遇到了实际实现的问题。有人可以建议如何重构此代码吗?
答案 0 :(得分:2)
您可以使用Cor Pattern进行验证“Behavior”:您的每个验证器都会实现一个基本ChainedValidator
接口(某些行为可以移动到父抽象类,因为它对所有人都是相同的连锁成员):
public class MyFirstValidator implements ChainedValidator{
//This CoR implementation has also a 'Composite' background
ChainedValidator nextValidator;
@Override
private void doValidate(Request request) throws ValidationException
{
if(badSituation){
//throw validation exception
}
}
@Override
public void doChainValidate(Request request) throws ValidationException
{//This method can be moved to a parent abstract class
doValidate(request);
if(nextValidator!=null){
nextValidator.doChainValidate(request);
}
}
private void attachValidator(ChainedValidator newValidator) throws ValidationException
{//same as previous method
if(nextValidator!=null){
nextValidator.attachValidator(request);
}else{
nextValidator=newValidator;
}
}
//setters & other methods
}
在您的控制器/ Web层服务类上,您可以注入验证链的第一个ChainedValidator
并调用doChainValidate
:
public class WebTierService{
ChainedValidator validator;
public Response serviceMethod(Request request){
try{
//...
validator.doChainValidate(request);
//...
}catch(ValidationException e){
return Response.status(400).entity(e.getMessage()).build();
}
}
}
正如您所看到的,逻辑是“流畅的”(否则,如果根据验证错误的类型进行检查),添加新的验证器相对简单(validator.attachValidator()
),这使得逻辑可扩展和清洁。 / p>