备注: 责任链与策略模式有很多相似之处,如都是行为型设计模式,都能够处理代码中的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(); }