责任链模式Java+Spring实现

业务场景

一般的操作校验接口有参数校验、安全校验、黑名单校验、操作规则等等。

问题

常见同步编写code,校验失败return,代码链路较长,修改不符合开闭原则。

责任链模式定义

责任链模式为请求创建了一个接收者对象的链。执行链上有多个对象节点,每个对象节点都有机会(条件匹配)处理请求事务,如果某个对象节点处理完了,就可以根据实际业务需求传递给下一个节点继续处理或者返回处理完毕。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。

责任链模式使用

  • 一个接口或者抽象类

  • 每个对象差异化处理

  • 对象链(数组)初始化(连起来)

责任链模式实现

抽象类:

  • 有一个指向责任下一个对象的属性

  • 一个设置下一个对象的set方法

  • 给子类对象差异化实现的方法

public abstract class AbstractCheckHandler {

    /**
     * 责任链中的下一个对象
     */
    private AbstractCheckHandler nextHandler;

    /**
     * 责任链的下一个对象
     */
    public void setNextHandler(AbstractCheckHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    /**
     * 具体参数拦截逻辑,给子类去实现
     */
    public void filter(Request request, Response response) {
        handle(request, response);
        // 处理结果为空或者成功,则继续处理;否则结束处理退出,不需要整条链路处理
        if (ObjectUtil.isNull(response) || HttpStatusEnum.SERVER_SUCCESS.getCODE().equals(response.getCode())) {
            if (getNextHandler() != null) {
                getNextHandler().filter(request, response);
            }
        }
    }

    public AbstractCheckHandler getNextHandler() {
        return nextHandler;
    }

    public abstract void handle(Request Request, Response response);
}

每个对象处理

即各种校验场景

/**
 * 参数校验对象
 **/
@Component
@Order(1) //顺序排第1,最先校验
public class CheckParamFilterObject extends AbstractCheckHandler {

    @Override
    public void doFilter(Request request, Response response) {
        System.out.println("非空参数检查");
    }
}

/**
 *  安全校验对象
 */
@Component
@Order(2) //校验顺序排第2
public class CheckSecurityFilterObject extends AbstractCheckHandler {

    @Override
    public void doFilter(Request request, Response response) {
        //invoke Security check
        System.out.println("安全调用校验");
    }
}

/**
 *  黑名单校验对象
 */
@Component
@Order(3) //校验顺序排第3
public class CheckBlackFilterObject extends AbstractCheckHandler  {

    @Override
    public void doFilter(Request request, Response response) {
        //invoke black list check
        System.out.println("校验黑名单");
    }
}

对象处理责任链实现

@Component
public class RequestCheckHandlerChain {

    /**
     * 自动注入各个责任链的对象
     */
    @Autowired
    private List<AbstractCheckHandler> abstractHandleList;

    private AbstractCheckHandler abstractHandler;

    //spring注入后自动执行,责任链的对象连接起来
    @PostConstruct
    public void initializeChainFilter() {
        for (int i = 0; i < abstractHandleList.size(); i++) {
            if (i == 0) {
                abstractHandler = abstractHandleList.get(0);
            } else {
                AbstractCheckHandler currentHander = abstractHandleList.get(i - 1);
                AbstractCheckHandler nextHander = abstractHandleList.get(i);
                currentHander.setNextHandler(nextHander);
            }
        }
    }

    //调用执行使用
    public Response exec(Request request, Response response) {
        abstractHandler.filter(request, response);
        return response;
    }

    public AbstractCheckHandler getAbstractHandler() {
        return abstractHandler;
    }

    public void setAbstractHandler(AbstractCheckHandler abstractHandler) {
        this.abstractHandler = abstractHandler;
    }
}

调用

@Autowired
private RequestCheckHandlerChain requestCheckHandlerChain;

...

requestCheckHandlerChain.exec(request, response);

End

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值