备注:
责任链与策略模式有很多相似之处,如都是行为型设计模式,都能够处理代码中的if-else逻辑
主要区别在于:
策略模式 封装了算法,通过上下文对象去接受客户端的数据,根据数据类型执行不同的算法
策略模式的客户端知道所有算法以及各种算法的区别
package com.gabriel.stage.design;
import cn.hutool.core.collection.CollectionUtil;
import com.gabriel.stage.common.enums.HandlerBeanEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.LinkedList;
import java.util.List;
/**
* @author: Gabriel
* @date: 2020/3/15 23:53
* @description 职责处理器
*/
@Component
public class ExecuteHandler {
@Autowired
private ApplicationContext context;
private List<Handler> handlerList = new LinkedList<>();
private Handler handler;
public Handler getHandler() {
return handler;
}
/**
* 该方法会在该对象创建之后被调用
*
* @throws Exception
*/
@PostConstruct
public void afterPostConstruct() throws Exception {
HandlerBeanEnum[] values = HandlerBeanEnum.values();
for (HandlerBeanEnum value : values) {
Handler bean = context.getBean(value.getBeanName(), Handler.class);
handlerList.add(bean);
}
if (CollectionUtil.isNotEmpty(handlerList)) {
for (int i = 1; i < handlerList.size(); i++) {
//当前处理器
Handler currentHandler = handlerList.get(i - 1);
//下一个处理器
Handler nextHandler = handlerList.get(i);
//将处理器串成链表
currentHandler.setNextHandler(nextHandler);
}
this.handler = handlerList.get(0);
}
}
}
package com.gabriel.stage.design;
import org.springframework.stereotype.Component;
/**
* @author: Gabriel
* @date: 2020/3/15 23:41
* @description A处理器
*/
@Component("aHandler")
public class AHandler extends Handler {
private final Integer order = 1;
private Handler nextHandler;
@Override
public Handler getNextHandler() {
return nextHandler;
}
@Override
public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
}
public final Integer myNum = 10;
@Override
public void dealRequest(Integer num) {
if (myNum.equals(num)) {
System.out.println("num==10,A责任链处理");
}else {
//交给下一个处理器处理
nextHandler.dealRequest(num);
}
}
}
package com.gabriel.stage.design;
import lombok.Data;
import org.springframework.stereotype.Component;
/**
* @author: Gabriel
* @date: 2020/3/15 23:41
* @description B处理器
*/
@Component("bHandler")
public class BHandler extends Handler {
private final Integer order = 2;
private Handler nextHandler;
@Override
public Handler getNextHandler() {
return nextHandler;
}
@Override
public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
}
public final Integer myNum = 100;
@Override
public void dealRequest(Integer num) {
if (myNum == num) {
System.out.println("num==100,B责任链处理");
}else {
nextHandler.dealRequest(num);
}
}
}
package com.gabriel.stage.design;
import org.springframework.stereotype.Component;
/**
* @author: Gabriel
* @date: 2020/3/15 23:41
* @description C处理器
*/
@Component("cHandler")
public class CHandler extends Handler {
private final Integer order = 3;
@Override
public void dealRequest(Integer num) {
System.out.println("num!=10 && num!=100,C责任链处理");
}
}
package com.gabriel.stage.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author: Gabriel
* @date: 2020/3/16 14:32
* @description 处理器Bean枚举
*/
@Getter
@AllArgsConstructor
public enum HandlerBeanEnum {
AHandler("aHandler"),
BHandler("bHandler"),
CHandler("cHandler");
private String beanName;
}
@Autowired
private ExecuteHandler executeHandler;
/**
* 测试责任链模式
* @return
*/
@GetMapping("/test/{num}")
public Result testHandler(@PathVariable Integer num){
Handler handler = executeHandler.getHandler();
handler.dealRequest(num);
return Result.success();
}