备注:
责任链与策略模式有很多相似之处,如都是⾏为型设计模式,都能够处理代码中的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 /** * 该⽅法会在该对象创建之后被调⽤ * * @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(); } 因篇幅问题不能全部显示,请点此查看更多更全内容