基于SpringBoot实现责任连模式

54 阅读1分钟

定义一个简易版的处理对象

@Data
@AllArgsConstructor
public class BaseContext {
    /**
     * 请求唯一序列ID
     */
    private String seqId;
}

定义一个数据处理接口

public interface HandleIntercept {


    /**
     * 对参数进行处理
     */
    BaseContext handle(BaseContext context);

    /**
     * 判断是否匹配
     */
    default boolean isMatch(BaseContext context) {
        return Boolean.TRUE;
    }
}

数据处理具体实现

处理一

@Component
public class HandleFirst implements HandleIntercept {

    @Override
    public BaseContext handle(BaseContext context) {
        System.out.println("HandleFirst Handler:" + context.getSeqId());
        return context;
    }
}

处理二

@Component
public class HandleSecond implements HandleIntercept {
    @Override
    public BaseContext handle(BaseContext context) {
        System.out.println("HandleSecond Handler:" + context.getSeqId());
        return context;
    }
}

处理三

@Component
public class HandleThird implements HandleIntercept {
    @Override
    public BaseContext handle(BaseContext context) {
        System.out.println("HandleThird Handler:" + context.getSeqId());
        return context;
    }
}

实现责任链管理器,用于管理这些实现类。

@Component
public class HandleChainService {

    private List<HandleIntercept> handleList = new ArrayList<>();

    @Resource
    private HandleFirst handleFirst;
    @Resource
    private HandleSecond handleSecond;
    @Resource
    private HandleThird handleThird;

    @PostConstruct
    public void init(){
        //依次手动add对象
        handleList.add(handleFirst);
        handleList.add(handleSecond);
        handleList.add(handleThird);
    }

    /**
     * 执行处理
     * @param context
     * @return
     */
    public void execute(BaseContext context){
        for (HandleIntercept handleIntercept : handleList) {
            if (handleIntercept.isMatch(context)) {
                handleIntercept.handle(context);
            }
        }
    }
}

编写测试类

@Resource
private HandleChainService handleChainService;

@Test
public void testHandleChain() {
    BaseContext context = new BaseContext("1");
    handleChainService.execute(context);
}

执行结果

HandleFirst Handler:1
HandleSecond Handler:1
HandleThird Handler:1