使用建造者模式来构建Result返回类

226 阅读2分钟

我在过去的springboot + vue2的项目中一直使用Result + ResultUtil类来完成前后端的数据交互。 Result类含有以下属性

    // 业务流程是否成功,失败返回false
    private Boolean success;
    // 带有消息
    private String message;
    // 返回码,失败时返回指定状态码
    private ResultCode code;
    // 返回业务数据
    private T data;

ResultUtil工具类一般都有比较多的重载方法来实现这四个属性的不同构造

/**
 * 返回结果工具类
 */
public class ResultUtil<T> {

    /**
     * 抽象类,存放结果
     */
    private final ResultMessage<T> resultMessage;
    /**
     * 正常响应
     */
    private static final Integer SUCCESS = 200;


    /**
     * 构造话方法,给响应结果默认值
     */
    public ResultUtil() {
        resultMessage = new ResultMessage<>();
        resultMessage.setSuccess(true);
        resultMessage.setMessage("success");
        resultMessage.setCode(SUCCESS);
    }

    /**
     * 返回数据
     *
     * @param t 范型
     * @return 消息
     */
    public ResultMessage<T> setData(T t) {
        this.resultMessage.setResult(t);
        return this.resultMessage;
    }


    /**
     * 返回成功消息
     *
     * @param resultCode 返回码
     * @return 返回成功消息
     */
    public ResultMessage<T> setSuccessMsg(ResultCode resultCode) {
        this.resultMessage.setSuccess(true);
        this.resultMessage.setMessage(resultCode.message());
        this.resultMessage.setCode(resultCode.code());
        return this.resultMessage;

    }

    /**
     * 抽象静态方法,返回结果集
     * @param t 范型
     * @param <T>  范型
     * @return 消息
     */
    public static <T> ResultMessage<T> data(T t) {
        return new ResultUtil<T>().setData(t);
    }

    /**
     * 返回成功
     *
     * @param resultCode 返回状态码
     * @return 消息
     */
    public static <T> ResultMessage<T> success(ResultCode resultCode) {
        return new ResultUtil<T>().setSuccessMsg(resultCode);
    }

    /**
     * 返回成功
     * @return 消息
     */
    public static <T> ResultMessage<T> success() {
        return new ResultUtil<T>().setSuccessMsg(ResultCode.SUCCESS);
    }

    /**
     * 返回失败
     *
     * @param resultCode 返回状态码
     * @return 消息
     */
    public static <T> ResultMessage<T> error(ResultCode resultCode) {
        return new ResultUtil<T>().setErrorMsg(resultCode);
    }

    /**
     * 返回失败
     *
     * @param code 状态码
     * @param msg  返回消息
     * @return 消息
     */
    public static <T> ResultMessage<T> error(Integer code, String msg) {
        return new ResultUtil<T>().setErrorMsg(code, msg);
    }

   // 以下省略

}

这个工具类虽然使用时比较简单,但是看起来着实是代码有点繁琐,正好之前学过建造者模式,使用链式构造可以很好的简化代码

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Result<T> {
    // 业务流程是否成功,失败返回false
    private Boolean success;
    // 带有消息
    private String message;
    // 返回码,失败时返回指定状态码
    private ResultCode code;
    // 返回业务数据
    private T data;

    public Result(ResultBuilder<T> resultBuilder){
        this.code = resultBuilder.getCode();
        this.success = resultBuilder.getSuccess();
        this.message = resultBuilder.getMessage();
        this.data = resultBuilder.getData();
    }
    // 内部构造类
    @Data
    public static class ResultBuilder<T>{
        private Boolean success;
        private String message;
        private ResultCode code;
        private T data;

        public ResultBuilder<T> setMessage(String message) {
            this.message = message;
            return this;
        }

        public ResultBuilder<T> setCode(ResultCode code) {
            this.code = code;
            return this;
        }

        public ResultBuilder<T> setData(T data) {
            this.data = data;
            return this;
        }

        public Result<T> buildSuccess(){
            this.setSuccess(true);
            if(this.code == null){
                this.code = ResultCode.SUCCESS;
            }if(this.message == null){
                this.message = this.code.getMessage();
            }
            return new Result<T>(this);
        }

        public Result<T> buildError(){
            this.setSuccess(false);
            if(this.code == null){
                this.code = ResultCode.ERROR;
            }if(this.message == null){
                this.message = this.code.getMessage();
            }
            return new Result<T>(this);
        }
    }
}

对于需要用到的属性使用set赋值,最后根据业务来使用buildSuccess或者buildError来构造result类,对于没有指定的message和code可以根据是否为成功相应来设置默认值

以下为一个登入使用案例

public Result login(LoginParam loginParams) {
    System.out.println(loginParams);
    User user = userMapper.selectUserByName(loginParams.getUsername());
    if(user == null) {
       return new Result.ResultBuilder<>().setCode(ResultCode.User_Username_NotExist).buildError();
    }
    if(!user.getPassword().equals(loginParams.getPassword())){
        return new Result.ResultBuilder<>().setCode(ResultCode.User_Password_Error).buildError();
    }else {
        String s = JwtUtil.generateToken(user);
        return new Result.ResultBuilder<String>().setData(s).buildSuccess();
    }
}

虽然使用上不如ResultUtil工具类简洁,但是不再需要写那么多的重载方法了

如果代码有误或者漏洞,欢迎指正。本人在校学生,代码能力还是挺薄弱的