0

我正在考虑为验证器提供一个好的实现。我的服务方法是这样开始的:

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 Responsibilityor Composite,但是我在实际实现方面遇到了问题。有人可以建议如何重构这段代码吗?

4

1 回答 1

2

您可以将 Cor 模式用于验证“行为”:您的每个验证器都将实现一个基本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();
        }

    }
}

如您所见,逻辑是“流动的”(否 if else 检查取决于验证错误的类型)并且添加新的验证器相对简单(validator.attachValidator()),这使得逻辑可扩展且简洁。

于 2013-09-24T19:36:06.290 回答