设计模式-责任连

yydssc / 2024-10-14 / 原文

package com.example.cor.chain;

import com.example.cor.filter.Filter;

import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

public class ApplicationFilterChain implements FilterChain{



    private static final int INCREMENT = 10;


    // target
    private Servlet servlet;

    public void setServlet(Servlet servlet) {
        this.servlet = servlet;
    }

    // manage filters

    private Filter[] filters = new Filter[0];

    // filter count
    private int n;

    public void addFilter(Filter filter) {
        for (Filter f : filters) {
            if (f == filter) {
                return;
            }
        }

        // no capacity,
        if (n == filters.length) {
            Filter[] newFilters = new Filter[n + INCREMENT];
            System.arraycopy(this.filters,0,newFilters,0,n);
            filters = newFilters;
        }

        filters[n++] = filter;
    }

    // call next filter

    private int pos;// current filter index

    @Override
    public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException {

        if (pos < n) {
            // call next filter
            Filter filter = filters[pos++];
            filter.doFilter(request,response,this);
            return;
        }
        // call target
        servlet.service(request,response);
    }



}
package com.example.cor.chain;

import com.example.cor.filter.Filter;

import javax.servlet.Servlet;

public class ApplicationFilterFactory {


    public static FilterChain createFilterChain(Servlet servlet, Filter ... filters) {
        if (servlet==null) {
            return null;
        }
        ApplicationFilterChain chain = new ApplicationFilterChain();
        chain.setServlet(servlet);
        // add filters
        for (Filter filter : filters) {
            chain.addFilter(filter);
        }
        return chain;
    }
}
package com.example.cor.chain;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

public interface FilterChain {

    void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException;
}
package com.example.cor.filter;

import com.example.cor.chain.FilterChain;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

public interface Filter {
    void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;
}
package com.example.cor.filters;


import com.example.cor.chain.FilterChain;
import com.example.cor.filter.Filter;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

public class CostFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("CostFilter pre");
        chain.doFilter(request,response);
        System.out.println("CostFilter post");
    }
}