public interface CheckHandler {
CheckResult deal(Chain chain);
interface Chain{
// 获取当前 request
CheckRequest request();
// 转发request
CheckResult proceed(CheckRequest request);
}
}
public class RealChain implements CheckHandler.Chain {
public CheckRequest checkRequest;
public List<CheckHandler> checkHandlerList;
public int index;
public RealChain(CheckRequest request, List<CheckHandler> checkHandlerList, int index){
this.checkHandlerList = checkHandlerList;
this.checkRequest = request;
this.index = index;
}
@Override
public CheckRequest request() {
return this.checkRequest;
}
@Override
public CheckResult proceed(CheckRequest request) {
CheckResult result = null;
if (checkHandlerList.size() > index){
RealChain realChain = new RealChain(checkRequest, checkHandlerList, index+1);
CheckHandler checkHandler = checkHandlerList.get(index);
result = checkHandler.deal(realChain);
}
return result;
}
}
public class GroupLeader implements CheckHandler {
@Override
public CheckResult deal(Chain chain) {
CheckRequest request = chain.request();
log.info("小组长处理请假----> req={}", JacksonUtil.writeValueAsString(request));
if (request.getDays() > 1) {
CheckRequest newRequest = CheckRequest
.builder()
.days(request.getDays())
.customInfo(request.getCustomInfo())
.managerInfo("小组长说该员工表现不错")
.name(request.getName())
.reason(request.getReason())
.build();
return chain.proceed(newRequest);
}
return new CheckResult(true, "groupLeader: 早去早回");
}
}
public class ManagerLeader implements CheckHandler {
@Override
public CheckResult deal(Chain chain) {
CheckRequest request = chain.request();
log.info("主管处理请假----> req={}", JacksonUtil.writeValueAsString(request));
if (request.getDays() > 3) {
CheckRequest newRequest = CheckRequest
.builder()
.days(request.getDays())
.customInfo(request.getCustomInfo())
.departmentHeaderInfo("主管说该员工表现不错")
.name(request.getName())
.reason(request.getReason())
.build();
return chain.proceed(newRequest);
}
return new CheckResult(true, "mangerLeader: 早点把事情办完,项目离不开你");
}
}
public class DepartmentHeader implements CheckHandler {
@Override
public CheckResult deal(Chain chain) {
CheckRequest request = chain.request();
log.info("BOSS处理请假----> req={}", JacksonUtil.writeValueAsString(request));
if (request.getDays() > 7) {
return new CheckResult(false, "你这个完全没有必要");
}
return new CheckResult(true, "boss: 不要着急,慢慢处理完事情");
}
}
@Data
@Builder
public class CheckRequest {
private String name;
private String reason;
private int days;
private String groupLeaderInfo;
private String managerInfo;
private String departmentHeaderInfo;
private String customInfo;
}
@Data
public class CheckResult {
private boolean isRatify;
private String info;
public CheckResult(boolean isRatify, String info) {
this.isRatify = isRatify;
this.info = info;
}
public CheckResult() {
}
}
@Service
@Slf4j
public class ChainOfResponsibilityClient {
private List<CheckHandler> checkHandlerList;
public void addCheckHandler(CheckHandler checkHandler){
this.checkHandlerList.add(checkHandler);
}
@PostConstruct
public void init(){
this.checkHandlerList = new ArrayList<>();
}
public CheckResult execute(CheckRequest request){
RealChain realChain = new RealChain(request, this.checkHandlerList,0);
return realChain.proceed(request);
}
}
职责链模式
最新推荐文章于 2022-06-21 10:59:03 发布