【責任鏈模式】責任鏈模式結合Spring實戰Demo


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM