備注: 責任鏈與策略模式有很多相似之處,如都是行為型設計模式,都能夠處理代碼中的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(); }
