如何重构验证器

时间:2013-09-24 16:12:52

标签: java design-patterns architecture refactoring

我在考虑验证器的良好实现。我的服务方法是这样开始的:

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 ResponsibilityComposite,但是我遇到了实际实现的问题。有人可以建议如何重构此代码吗?

1 个答案:

答案 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>