设计模式原来这么简单-责任链模式

责任链模式

1.什么是责任链模式

WIKI:在面向对象设计中,责任链模式是一种由源命令对象和一系列处理对象组成的设计模式。每个处理对象包含了其定义的可处理的命令对象类型的逻辑。剩下的会传递给链条中的下一个处理对象。

2.案例

假如要处理一个请求并且要根据请求的级别来决定如何处理。

3.具体实现
@Data
public class RequestEntity {

    public enum RequestType{
        /**
         * 一级请求
         */
        FIRST,
        /**
         * 二级请求
         */
        SECOND,
        /**
         * 三级请求
         */
        THIRD
    }

    private String msg;

    private RequestType requestType;

    public boolean isEmpty(){
        return msg.isEmpty() || requestType == null;
    }
}
public abstract class AbstractRequestHandler {
    protected final AbstractRequestHandler nextHandler;

    protected AbstractRequestHandler(AbstractRequestHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    protected void doHandlerRequest(RequestEntity requestEntity){
        if(nextHandler != null){
            nextHandler.doHandlerRequest(requestEntity);
        }
    }
}
// 一级请求处理器
public class FirstRequestHandler extends AbstractRequestHandler{

    protected FirstRequestHandler(AbstractRequestHandler nextHandler) {
        super(nextHandler);
    }

    @Override
    protected void doHandlerRequest(RequestEntity requestEntity) {
        if(requestEntity.isEmpty()){
            throw new IllegalArgumentException("不合法的参数");
        }
        if(requestEntity.getRequestType().compareTo(RequestEntity.RequestType.FIRST) == 0){
            // 业务操作
            // ...
            System.out.println(String.format("%s:%s", this, requestEntity.getMsg()));
        }else{
            super.doHandlerRequest(requestEntity);
        }
    }
}
// 二级请求处理器
public class SecondRequestHandler extends AbstractRequestHandler{
    protected SecondRequestHandler(AbstractRequestHandler nextHandler) {
        super(nextHandler);
    }

    @Override
    protected void doHandlerRequest(RequestEntity requestEntity) {
        if(requestEntity.isEmpty()){
            throw new IllegalArgumentException("不合法的参数");
        }
        if(requestEntity.getRequestType().compareTo(RequestEntity.RequestType.SECOND) == 0){
            System.out.println(String.format("%s:%s", this, requestEntity.getMsg()));
        }else{
            super.doHandlerRequest(requestEntity);
        }

    }
}
// 构建责任链
public class ChainOrderBuilder {

    private FirstRequestHandler requestHandler;

    public ChainOrderBuilder(){
        doBuild();
    }

    private void doBuild() {
        requestHandler = new FirstRequestHandler(new SecondRequestHandler(null));
    }

    public void startHandlerRequest(RequestEntity requestEntity){
        requestHandler.doHandlerRequest(requestEntity);
    }
}
@Test
public void test(){
    RequestEntity requestEntity2 = new RequestEntity();
    requestEntity2.setMsg("二级请求Msg");
    requestEntity2.setRequestType(RequestEntity.RequestType.SECOND);

    ChainOrderBuilder chainOrderBuilder = new ChainOrderBuilder();
    chainOrderBuilder.startHandlerRequest(requestEntity2);
}

//输出
com.zyy.chain.SecondRequestHandler@73a8dfcc:二级请求Msg

4.总结

该模式将本可以在一个类中用多个if-else可以实现的需求解耦成多个类实现,使系统的扩展更加灵活。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值