Soul网关 - 责任链模式


Soul网关里面的各个插件都是采用的是责任链模式,今天我们就来聊一聊责任链模式。

什么是责任链模式

  • 将请求的发送和接受解耦,让多个接受对象都有机会处理这个请求。将这个接受对象串成一条链,并沿着这条链传递这个请求,知道链上的某个对象能够处理它为止。
  • 实际上责任链模式还有一种变体,那就是请求会被所有的处理器都处理一边,不存在终止的情况。
  • 其实我们可以将责任链模式看成是一个生产汽车的流水线,整条流水线是一条责任链,每个工人相当于一个Handler,装轮胎的是一个装轮胎的Handler,喷漆的工人是一个喷漆的Handler,大家各自完成自己的任务,整条流水线一起完成生产汽车这个任务。
    在这里插入图片描述

责任链模式主要解决了什么问题?

  • 请求和处理解耦
    责任链上的处理者会负责处理请求,用户只需要将请求发送到责任链上,无需关心请求处理的细节和请求的传递。
  • 降低处理过程的复杂性
    用户在处理请求的过程中,可以将一个大的处理拆分成多个Handler对象,这些Handler对象都绑定到这个责任链上,每个Handler都只处理自己负责的那部分功能,最终一起完成任务;这样做同时使得对请求处理的拓展变得非常方便。

责任链模式的使用场景

  • 过滤器、拦截器;
  • Netty 的编码、解码过程;
  • JS中的事件冒泡;

代码示例

代码这块主要有三个部分组成:Handler接口(IHandler)、Handler处理器、责任链(HandlerChain)。
IHandler

package com.example.demo.designPattern.chains.array;

public interface IHandler {
    boolean handler();
}

HandlerA

package com.example.demo.designPattern.chains.array;

public class HandlerA implements IHandler {
    @Override
    public boolean handler() {
        boolean handled = false;
        //...
        System.out.println("Handler A process...");
        return handled;
    }
}

HandlerB

package com.example.demo.designPattern.chains.array;

public class HandlerB implements IHandler {

    @Override
    public boolean handler() {
        boolean handled = false;
        // ...
        System.out.println("Handler B process...");

        return handled;
    }
}

HandlerChain

package com.example.demo.designPattern.chains.array;

package com.example.demo.designPattern.chains.array;

import java.util.ArrayList;
import java.util.List;

public class HandlerChain {
    private List<IHandler> handlers = new ArrayList<>();

    // 绑定Handler
    public void addHandler(IHandler handler) {
        this.handlers.add(handler);
    }

    // 执行责任链上Handler的处理
    public void handler() {
        for (IHandler handler : handlers) {
            boolean handled = handler.handler();
            if (handled) {
                break;
            }
        }
    }
}

Main函数测试

package com.example.demo.designPattern.chains.array;

public class Application {
    public static void main(String[] args) {
        //1.创建一个责任链
        HandlerChain chain = new HandlerChain();
        //2.绑定两个处理的Handler
        chain.addHandler(new HandlerA());
        chain.addHandler(new HandlerB());
        //3.执行处理方法
        chain.handler();
    }
}

演示结果
在这里插入图片描述

责任链模式在框架中运用的好处

我们在引入别人框架的时候,常常无法修改别人的框架源码,但是如果是使用责任链模式,我们只需要往这个责任链里面添加自己的Handler,就可以完成自己的处理过程,非常好的实现了开闭原则。

总结

在责任链模式中,多个处理器依次处理同一个请求。一个请求先经过A处理器处理,然后再把请求传递给B处理器,B处理器处理完以后再传给C处理器,以此类推,形成责任链。责任链上的每个处理器各自承担自己的职责,所以叫做责任链模式。

猜你喜欢

转载自blog.csdn.net/qq_35115942/article/details/112690584
今日推荐