简单实现个责任链

1.GlobalFilter 接口:定义了过滤器的方法 getOrder()filter(Request request)

public interface GlobalFilter {
    int getOrder();
    void filter(Request request);
}

2.AbstractNextFilter 抽象类:实现了获取下一个过滤器的方法 getNextFilter(),并且提供了一个匿名抽象类实现了抽象方法 filter(Request request),在该方法中通过责任链的方式依次调用下一个过滤器进行处理

public abstract class AbstractNextFilter implements GlobalFilter {

    public GlobalFilter getNextFilter(List<GlobalFilter> globalFilters) {
        // 获取过滤器执行链的最小order,如果相同则排除本过滤器
        Optional<GlobalFilter> nextFilter = globalFilters.stream()
                .filter(filter -> filter.getOrder() >= this.getOrder() && filter.getClass() != this.getClass())
                .min(Comparator.comparing(GlobalFilter::getOrder));
        return nextFilter.orElse(null);
    }
}

3.Handler 接口:定义了处理请求的方法 handleRequest(Request request)

public interface Handler {
    void handleRequest(Request request);
}

4.HandlerImpl 类:实现了 Handler 接口,在 handleRequest(Request request) 方法中创建一个匿名抽象类的过滤器实例,并开始责任链的传递处理

public class HandlerImpl implements Handler {
    private final List<GlobalFilter> globalFilters;

    public HandlerImpl(Request request) {
        this.globalFilters = request.getGlobalFilters();
    }

    @Override
    public void handleRequest(Request request) {
        if (request.getGlobalFilters() != null) {
            GlobalFilter filter = new AbstractNextFilter() {
                @Override
                public int getOrder() {
                    return Integer.MIN_VALUE;
                }

                @Override
                public void filter(Request request) {
                    GlobalFilter nextFilter = getNextFilter(request.getGlobalFilters());
                    System.out.println("匿名抽象类,开始传递");
                    nextFilter.filter(request);
                }
            };
            filter.filter(request);
        }
        System.out.println("处理请求数据:" + request.getContent());
    }
}

5.OneFilterTwoFilter 类:具体的过滤器实现类,分别实现了自己的过滤逻辑,并根据条件判断是否继续传递给下一个过滤器

public class OneFilter extends AbstractNextFilter {

    @Override
    public int getOrder() {
        return 1;
    }

    @Override
    public void filter(Request request) {
        GlobalFilter nextFilter = getNextFilter(request.getGlobalFilters());
        if ("不过滤OneFilter".equals(request.getContent())) {
            if (nextFilter != null) {
                // 直接放行
                nextFilter.filter(request);
            }
        } else {
            System.out.println("OneFilter 过滤器执行了");
            if (nextFilter != null) {
                nextFilter.filter(request);
            }
        }
    }
}


public class TwoFilter extends AbstractNextFilter {
    @Override
    public int getOrder() {
        return 2;
    }

    @Override
    public void filter(Request request) {
        GlobalFilter nextFilter = super.getNextFilter(request.getGlobalFilters());
        if ("不过滤TwoFilter".equals(request.getContent())) {
            if (nextFilter != null) {
                // 直接放行
                nextFilter.filter(request);
            }
        } else {
            System.out.println("TwoFilter 过滤器执行了");
            if (nextFilter != null) {
                nextFilter.filter(request);
            }
        }
    }
}

6.Request 类:封装了请求对象,包括全局过滤器列表和请求内容

public class Request {
    private List<GlobalFilter> globalFilters;
    private String content;

    public Request(List<GlobalFilter> globalFilters, String content) {
        this.globalFilters = globalFilters;
        this.content = content;
    }

    public List<GlobalFilter> getGlobalFilters() {
        return globalFilters;
    }

    public void setGlobalFilters(List<GlobalFilter> globalFilters) {
        this.globalFilters = globalFilters;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

7.测试类:当请求的数据content为不过滤OneFilter会放行到下个过滤器执行

public class TestResChain {

    public static void main(String[] args) {
        List<GlobalFilter> filterList = new ArrayList<>();
        filterList.add(new OneFilter());
        filterList.add(new TwoFilter());

        Request request = new Request(filterList, "不过滤OneFilter");
//        Request request = new Request(filterList, "不过滤TwoFilter");
//        Request request = new Request(filterList, "都过滤拦截");
        Handler handler = new HandlerImpl(request);
        handler.handleRequest(request);
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值