SpringBoot中使用责任链模式

436 阅读2分钟

1.控制器

创建Controller,注入ApproveChain,在approve方法中调用approveChain

@RestController
@RequestMapping("/approve")
@Api(tags = "审批流")
public class ApproveController {
    private ApproveChain approveChain;
​
    public ApproveController(ApproveChain approveChain) {
        this.approveChain = approveChain;
    }
​
    @GetMapping
    @ApiOperation("审批")
    public ResponseMessage approve(@RequestBody RequestVO requestVO) {
        RequestDTO requestDTO = new RequestDTO();
        BeanUtils.copyProperties(requestVO,requestDTO);
​
        String result = approveChain.process(requestDTO);
        return ResponseMessage.success(result);
    }
}

其中VO实体类

@Data
@ApiModel(description = "用户请求")
public class RequestVO {
    @ApiModelProperty("用户名称")
    private String name;
    @ApiModelProperty("请假天数")
    private Integer day;
}

2.业务逻辑

创建Service接口

public interface ApproveService {
    String process(RequestDTO request);
​
    void setNext(ApproveService approveService) throws Exception;
​
    ApproveService getNext();
}

分别创建四个Service实现类,其中主要注意@Order注解

@Order(1)
@Service
@Slf4j
public class ApproveServiceLeaderImpl implements ApproveService {
    private ApproveService next;
​
    @Override
    public String process(RequestDTO request) {
        if(request.getDay() <= 3){
            log.info("Leader审批了 {} 的 {} 天请求",request.getName(),request.getDay());
            return "Leader";
        }
        log.info("{} 的请假超出了Leader的上限,无法审批",request.getName());
        return getNext().process(request);
    }
​
    @Override
    public void setNext(ApproveService approveService) {
        this.next = approveService;
    }
​
    @Override
    public ApproveService getNext() {
        return next;
    }
}

然后穿件ApproveChain,将所有的ApproveService注入进来,然后在init方法中构造链条

@Service
@Slf4j
public class ApproveChain {
    private ApproveService approveService;
​
    private List<ApproveService> approveServicesList;
​
    public ApproveChain(List<ApproveService> approveServicesList) {
        this.approveServicesList = approveServicesList;
    }
​
    public String process(RequestDTO request) {
        return approveService.process(request);
    }
​
    @PostConstruct
    public void init() {
        if (approveServicesList.size() == 0) {
            log.error("没有设置责任链");
            return;
        }
​
        approveService = approveServicesList.get(0);
​
        int index = 1;
        for (ApproveService handler : approveServicesList) {
            if (index <= approveServicesList.size()) {
                try {
                    handler.setNext(approveServicesList.get(index++));
                    log.debug("Set handler :{}", handler);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

其中使用的DTO类

@Data
public class RequestDTO {
    private String name;
    private Integer day;
}

3.测试

启动Application,进行登录获取Cookie:01BB1314E27551B06E5C78A4BBF0DEB0

image-20220106141358478.png

然后调用approve接口,传入Cookie:XXL_JOB_LOGIN_IDENTITY=7b226964223a312c22757365726e616d65223a2261646d696e222c2270617373776f7264223a223034366363393730636135653037383936376138343937326534616135313735222c22726f6c65223a312c227065726d697373696f6e223a6e756c6c7d; JSESSIONID=80ADD86F29C09A3DE7F97F12B129CE1D

image-20220106141537734.png