适用性
在以下情况下使用拦截过滤器模式
- 系统使用预处理或后处理请求
 
- 系统应该对请求进行身份验证/授权/记录或跟踪,然后将请求传递给相应的处理程序
 
- 需要一种模块化方法来配置预处理和后处理方案
 
以下是此类设计模式的实体。
- 过滤器- 过滤器将在请求处理程序执行请求之前或之后执行某些任务。
 
- 过滤器链- 过滤器链带有多个过滤器,并帮助在目标上按定义的顺序执行它们。
 
- Target - 目标对象是请求处理程序
 
- 过滤器管理器- 过滤器管理器管理过滤器和过滤器链。
 
- Client - Client 是向 Target 对象发送请求的对象。
 
步骤1
创建过滤器界面。
1 2 3
   | public interface Filter {    public void execute(String request); }
  | 
 
第2步
创建认证过滤器。
1 2 3 4 5
   | public class AuthenticationFilter implements Filter {    public void execute(String request){       System.out.println("Authenticating request: " + request);    } }
  | 
 
*debug过滤器
1 2 3 4 5
   | public class DebugFilter implements Filter {    public void execute(String request){       System.out.println("request log: " + request);    } }
  | 
 
第 3 步
关于target,可以传递自己想要执行的某一业务方法,或者上下文都可以
1 2 3 4 5
   | public class Target {    public void execute(String request){       System.out.println("Executing request: " + request);    } }
  | 
 
第4步
创建过滤器链
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
   | import java.util.ArrayList; import java.util.List;
  public class FilterChain {    private List<Filter> filters = new ArrayList<Filter>();    private Target target;
     public void addFilter(Filter filter){       filters.add(filter);    }
     public void execute(String request){       for (Filter filter : filters) {          filter.execute(request);       }       target.execute(request);    }
     public void setTarget(Target target){       this.target = target;    } }
   | 
 
第 5 步
创建过滤器管理器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
   | public class FilterManager {    FilterChain filterChain;
     public FilterManager(Target target){       filterChain = new FilterChain();       filterChain.setTarget(target);    }    public void setFilter(Filter filter){       filterChain.addFilter(filter);    }
     public void filterRequest(String request){       filterChain.execute(request);    } }
  | 
 
第 6 步
创建客户端
1 2 3 4 5 6 7 8 9 10 11
   | public class Client {    FilterManager filterManager;
     public void setFilterManager(FilterManager filterManager){       this.filterManager = filterManager;    }
     public void sendRequest(String request){       filterManager.filterRequest(request);    } }
  | 
 
第 7 步
使用客户端演示拦截过滤器设计模式。
1 2 3 4 5 6 7 8 9 10 11
   | public class InterceptingFilterDemo {    public static void main(String[] args) {       FilterManager filterManager = new FilterManager(new Target());       filterManager.setFilter(new AuthenticationFilter());       filterManager.setFilter(new DebugFilter());
        Client client = new Client();       client.setFilterManager(filterManager);       client.sendRequest("HOME");    } }
  | 
 
第 8 步
验证输出。
1 2 3
   | Authenticating request: HOME request log: HOME Executing request: HOME
   |