java设计模式-责任链模式

293 阅读1分钟

1.简单版本,就是多个filter的方法顺序执行

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

public class Test1 {
    public static void main(String[] args) {
        Msg msg = new Msg();
        msg.setMsg("aaa<aaa>????++++");
        FilterChain filterChain = new FilterChain();
        filterChain.addFilter(new Filter1()).addFilter(new Filter2());

        FilterChain filterChain2 = new FilterChain();
        filterChain2.addFilter(new Filter3()).addFilter(new Filter4());

        filterChain.addFilter(filterChain2);

        filterChain.doFilter(msg);
        System.out.println(msg);
    }
}
class Msg {
    private String msg;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    @Override
    public String toString() {
        return "Msg{" +
                "msg='" + msg + '\'' +
                '}';
    }
}
interface Filter{
    void doFilter(Msg s);
}

class Filter1 implements Filter{

    @Override
    public void doFilter(Msg s) {
        s.setMsg(s.getMsg().replace("<","["));
    }
}

class Filter2 implements Filter{

    @Override
    public void doFilter(Msg s) {
        s.setMsg(s.getMsg().replace(">","]"));
    }
}

class Filter3 implements Filter{

    @Override
    public void doFilter(Msg s) {
        s.setMsg(s.getMsg().replace("?","..."));
    }
}

class Filter4 implements Filter{

    @Override
    public void doFilter(Msg s) {
        s.setMsg(s.getMsg().replace("+","-"));
    }
}

class FilterChain implements Filter{
    private List<Filter> filters = new ArrayList<>();
    FilterChain addFilter(Filter filter){
        filters.add(filter);
        return this;
    }
    public void doFilter(Msg msg){
        for (Filter filter : filters) {
            filter.doFilter(msg);
        }
    }


2.模拟先顺序执行每个Filter的request,再倒序执行每个Filter的Response

关键点在于每个Filter有整个链条的引用,类似递归过程


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

/**
 * 但是我想处理的时候按执行Filter1,Filter2顺序执行,返回的时候按Filter2,Filter1的顺序执行
 * 类似递归调用
 */
public class Test1 {
    public static void main(String[] args) {
        Request request = new Request();
        Response response = new Response();
        request.setMsg("===");
        response.setMsg("+++");
        FilterChain filterChain = new FilterChain();
        filterChain.addFilter(new Filter1()).addFilter(new Filter2());
        filterChain.doFilter(request,response,filterChain);
        System.out.println("request = " + request);
        System.out.println("response = " + response);
    }
}

class Request{
    private String msg;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    @Override
    public String toString() {
        return "Request{" +
                "msg='" + msg + '\'' +
                '}';
    }
}

class Response {
    private String msg;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    @Override
    public String toString() {
        return "Response{" +
                "msg='" + msg + '\'' +
                '}';
    }
}

interface Filter{
    boolean doFilter(Request request,Response response,FilterChain filterChain);
}

class Filter1 implements Filter {

    @Override
    public boolean doFilter(Request request, Response response,FilterChain filterChain) {
        String msg = request.getMsg();
        request.setMsg(msg+"ccc");
        filterChain.doFilter(request,response,filterChain);
        String msg1 = response.getMsg();
        response.setMsg(msg1+"ddd");
        return true;
    }
}

class Filter2 implements Filter {

    @Override
    public boolean doFilter(Request request, Response response,FilterChain filterChain) {
        String msg = request.getMsg();
        request.setMsg(msg+"aaa");
        filterChain.doFilter(request,response,filterChain);
        String msg1 = response.getMsg();
        response.setMsg(msg1+"bbb");
        return true;
    }
}



class FilterChain implements Filter {
    private List<Filter> filters = new ArrayList<>();
    int index = 0;
    FilterChain addFilter(Filter filter){
        filters.add(filter);
        return this;
    }
    public boolean doFilter(Request request,Response response,FilterChain filterChain){
        if(index == filters.size()){
            return false;
        }
        Filter f = filters.get(index);
        index = index + 1;
        return f.doFilter(request,response,filterChain);
    }

}