springboot责任链模式,一个接一个的调用

责任链模式,简而言之,就是将多个操作组装成一条链路进行处理。请求在链路上传递,链路上的每一个节点就是一个处理器,每个处理器都可以对请求进行处理,或者传递给链路上的下一个处理器处理

具体来说,可以用list将方法依次装进去,一个接一个的执行
或者每个方法都指定好下一个调用的方法,调用第一个后,第一个会自动调用第二个,直到最后

第一种

定义传入参数和传出结果

class Request {
    String content;

    public Request(String content) {
        this.content = content;
    }
}

class Response {
    String content;

    public Response(String content) {
        this.content = content;
    }
}

定义链路单个节点的格式,包括参数、结果和链路本身

interface Filter {
    void doFilter(Request req, Response resp, FilterChain filterChain);
}

节点继承自上面定义的节点格式

\\节点一 替换996、增加返回htmlFilter 
class HTMLFilter implements Filter{
    @Override
    public void doFilter(Request req, Response resp, FilterChain filterChain) {
        req.content = req.content.replaceAll("996", "955");
        System.out.println("from HTML Filter: "+req.content);
        filterChain.doFilter(req, resp);
        resp.content += "---htmlFilter ";
    }
}

\\节点二 替换me、增加返回bodyFilter 
class BodyFilter implements Filter{
    @Override
    public void doFilter(Request req, Response resp, FilterChain filterChain) {
        req.content=req.content.replaceAll("me","everybody");
        System.out.println("from Body Filter:"+req.content);
        filterChain.doFilter(req,resp);
        resp.content+="--bodyFilter ";
    }
}

\\节点三 替换难过、增加返回footerFilter 
class FooterFilter implements Filter{
    @Override
    public void doFilter(Request req, Response resp, FilterChain filterChain) {
        req.content = req.content.replaceAll("难过", "开心");
        System.out.println("from Footer Filter: "+req.content);
        filterChain.doFilter(req, resp);
        resp.content += "--footerFilter ";
    }
}

链路需要有插入节点的方法addFilter和执行的方法doFilter

class FilterChain {
    List<Filter> filterList = new ArrayList<>();
    int idx = 0;
    public void addFilter(Filter filter) {
        filterList.add(filter);
    }

    public void doFilter(Request req, Response resp) {
        System.out.println(idx);
        if(idx >= filterList.size()) {
            return;
        }
        //这里去调用下一个
        filterList.get(idx++).doFilter(req, resp, this);
    }
}

调用

public class AddFilter {
    public static void main(String[] args) {
    //相当于list里挨个加节点
        FilterChain filterChain = new FilterChain();
        filterChain.addFilter(new HTMLFilter());
        filterChain.addFilter(new BodyFilter());
        filterChain.addFilter(new FooterFilter());

        Request request = new Request("996 makes me 难过");
        Response response = new Response("");
        //调用
        filterChain.doFilter(request, response);
        System.out.println("返回:"+ response.content);
    }
}

最后返回的结果

0
from HTML Filter: 955 makes me 难过
1
from Body Filter:955 makes everybody 难过
2
from Footer Filter: 955 makes everybody 开心
3
返回:--footerFilter --bodyFilter ---htmlFilter 

第二种

在节点中加了next

abstract class Filter2 {
    protected Filter2 next;
    public void next(Filter2 next){
        this.next=next;
    }
    public abstract void doFilter(Request req, Response resp);
}

next.doFilter()的方式调用下一个方法

class HTMLFilter2 extends Filter2{
    @Override
    public void doFilter(Request req, Response resp) {
        req.content = req.content.replaceAll("996", "955");
        System.out.println("from HTML Filter: "+req.content);
        next.doFilter(req, resp);
        resp.content += "---htmlFilter ";
    }
}

class BodyFilter2 extends Filter2{
    @Override
    public void doFilter(Request req, Response resp) {
        req.content=req.content.replaceAll("me","everybody");
        System.out.println("from Body Filter:"+req.content);
        next.doFilter(req, resp);
        resp.content+="--bodyFilter ";
    }
}

class FooterFilter2 extends Filter2{
    @Override
    public void doFilter(Request req, Response resp) {
        req.content = req.content.replaceAll("难过", "开心");
        System.out.println("from Footer Filter: "+req.content);
        resp.content += "--footerFilter ";
    }
}

调用时指定好next

class AddFilter2 {
    public static void main(String[] args) {
        HTMLFilter2 htmlFilter2 = new HTMLFilter2();
        BodyFilter2 bodyFilter2 = new BodyFilter2();
        FooterFilter2 footerFilter2 = new FooterFilter2();
        htmlFilter2.next(bodyFilter2);
        bodyFilter2.next(footerFilter2);

        Request request = new Request("996 makes me 难过");
        Response response = new Response("");
        htmlFilter2.doFilter(request, response);
        System.out.println("返回:"+ response.content);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值