橘子味的心
标题:Java拦截过滤器模式

当我们想要对应用程序的请求或响应进行一些预处理/后处理时,使用截取过滤器设计模式。 在将请求传递到实际目标应用程序之前,在请求上定义和应用过滤器。 过滤器可以进行请求的认证/授权/日志记录或跟踪,然后将请求传递给相应的处理程序。 以下是这种类型的设计模式的实体。

  • 过滤器 - 在请求处理程序执行请求之前或之后执行某些任务的过滤器。
  • 过滤器链 - 过滤器链携带多个过滤器,并帮助在目标上以定义的顺序执行它们。
  • 目标 - 目标对象是请求处理程序。
  • 过滤器管理器 - 过滤器管理器管理过滤器和过滤器链。
  • 客户端 - 客户端是向目标(Target)对象发送请求的对象。

实现示例

在这个实现示例中,将创建一个FilterChainFilterManagerTargetClient作为表示实体的各种对象。AuthenticationFilterDebugFilter表示具体的过滤器。

InterceptingFilterDemo是一个演示类,将使用客户端来演示拦截过滤器设计模式。

拦截过滤器模式示例的结构如下图所示 -

第1步

创建一个名为 Filter 的接口,其代码如下 -

Filter.java

  1. public interface Filter {
  2. public void execute(String request);
  3. }
  4. Java

第2步

创建具体过滤器,其代码如下 -
AuthenticationFilter.java

  1. public class AuthenticationFilter implements Filter {
  2. public void execute(String request){
  3. System.out.println("Authenticating request: " + request);
  4. }
  5. }
  6. Java

DebugFilter.java

  1. public class DebugFilter implements Filter {
  2. public void execute(String request){
  3. System.out.println("request log: " + request);
  4. }
  5. }
  6. Java

第3步

创建目标(Target)类,其代码如下 -
Target.java

  1. public class Target {
  2. public void execute(String request){
  3. System.out.println("Executing request: " + request);
  4. }
  5. }
  6. Java

第4步

创建过滤器链,其代码如下 -
FilterChain.java

  1. import java.util.ArrayList;
  2. import java.util.List;
  3.  
  4. public class FilterChain {
  5. private List<Filter> filters = new ArrayList<Filter>();
  6. private Target target;
  7.  
  8. public void addFilter(Filter filter){
  9. filters.add(filter);
  10. }
  11.  
  12. public void execute(String request){
  13. for (Filter filter : filters) {
  14. filter.execute(request);
  15. }
  16. target.execute(request);
  17. }
  18.  
  19. public void setTarget(Target target){
  20. this.target = target;
  21. }
  22. }
  23. Java

第5步

创建筛选管理器,其代码如下 -

FilterManager.java

  1. public class FilterManager {
  2. FilterChain filterChain;
  3.  
  4. public FilterManager(Target target){
  5. filterChain = new FilterChain();
  6. filterChain.setTarget(target);
  7. }
  8. public void setFilter(Filter filter){
  9. filterChain.addFilter(filter);
  10. }
  11.  
  12. public void filterRequest(String request){
  13. filterChain.execute(request);
  14. }
  15. }
  16. Java

第6步

创建客户端,其代码如下 -

Client.java

  1. public class Client {
  2. FilterManager filterManager;
  3.  
  4. public void setFilterManager(FilterManager filterManager){
  5. this.filterManager = filterManager;
  6. }
  7.  
  8. public void sendRequest(String request){
  9. filterManager.filterRequest(request);
  10. }
  11. }
  12. Java

第7步

使用客户端来演示拦截过滤器设计模式。
InterceptingFilterDemo.java

  1. public class InterceptingFilterDemo {
  2. public static void main(String[] args) {
  3. FilterManager filterManager = new FilterManager(new Target());
  4. filterManager.setFilter(new AuthenticationFilter());
  5. filterManager.setFilter(new DebugFilter());
  6.  
  7. Client client = new Client();
  8. client.setFilterManager(filterManager);
  9. client.sendRequest("HOME");
  10. }
  11. }
  12. Java

第8步

验证输出,执行上面的代码得到以下结果 -

  1. Authenticating request: HOME
  2. request log: HOME
  3. Executing request: HOME
  4. Java