• Chain of Responsibility
  • interface Filter {
        boolean doFilter(Msg m);
    }
    class HTMLFilter implements Filter {}
    class FilterChain implements Filter{
        List<Filter> filters = new ArrayList<>();
        public boolean doFilter(Msg msg){
            for (Filter f : filters) {
                if (!f.doFilter(msg)) {
                    return false;
                }
            }
            return true;
        }
        public FilterChain add(Filter f) {
            filters.add(f);
            return this;
        }
    }
    FilterChain fc = new FilterChain();
    FilterChain fc2 = new FilterChain();
    Filter f = new Filter();
    fc.add(f).add(fc2);
     
    # ServletFilter
    Filter1 implements Filter {
        void doFilter(req, resp, chain) {
            chain.doFilter(req, resp);
        }
    }
    FilterChain implements Filter {
        List<Filter> filters;
        int curIndex = 0;
        void doFilter(req, resp){
            curIndex++;
            if (curIndex < filters.size()) {
                filters[curIndex].doFilter(req, resp, this);
            }
        }
    }