设计模式教程
+ -

设计模式 拦截过滤器模式

2019-09-09 5 0

拦截过滤器模式(Intercepting FilterPattern)用于对应用程序的请求或响应做一些预处理/后处理。定义过滤器,并在把请求传给实际目标应用程序之前应用在请求上。过滤器可以做认证/授权/记录日志,或者跟踪请求,然后把请求传给相应的处理程序。以下是这种设计模式的实体。

  • 过滤器(Filter) - 过滤器在请求处理程序执行请求之前或之后,执行某些任务。
  • 过滤器链(Filter Chain) - 过滤器链带有多个过滤器,并在 Target 上按照定义的顺序执行这些过滤器。
  • Target - Target 对象是请求处理程序。
  • 过滤管理器(Filter Manager) - 过滤管理器管理过滤器和过滤器链。
  • 客户端(Client) - Client 是向 Target 对象发送请求的对象。

实现

我们将创建 FilterChain 、 FilterManager 、 Target 、 Client 作为表示实体的各种对象。AuthenticationFilter 和 DebugFilter 表示实体过滤器。

InterceptingFilterDemo ,我们的演示类使用 Client 来演示拦截过滤器设计模式。

拦截过滤器模式的UML图

步骤 1

创建过滤器接口 Filter。

Filter.java

public interface Filter {
   public void execute(String request);
}

步骤 2

创建实体过滤器。

AuthenticationFilter.java

public class AuthenticationFilter implements Filter {
   public void execute(String request){
      System.out.println("Authenticating request: " + request);
   }
}

DebugFilter.java

public class DebugFilter implements Filter {
   public void execute(String request){
      System.out.println("request log: " + request);
   }
}

步骤 3

创建 Target。

Target.java

public class Target {
   public void execute(String request){
      System.out.println("Executing request: " + request);
   }
}

步骤 4

创建过滤器链。

FilterChain.java

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

创建过滤管理器。

FilterManager.java

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

创建客户端 Client。

Client.java

public class Client {
   FilterManager filterManager;
   public void setFilterManager(FilterManager filterManager){
      this.filterManager = filterManager;
   }
   public void sendRequest(String request){
      filterManager.filterRequest(request);
   }
}

步骤 7

使用 Client 来演示拦截过滤器设计模式。

InterceptingFilterDemo.java

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

执行程序,输出结果:

Authenticating request: HOME
request log: HOME
Executing request: HOME

0 篇笔记 写笔记

Java 多线程编程
Java 给多线程编程提供了内置的支持。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。这里定义和线程相关的另一个术语 -进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程。......
Java Applet 基础
Applet 是一种 Java 程序。它一般运行在支持 Java 的 Web 浏览器内。因为它有完整的 Java API支持,所以Applet是一个全功能的 Java 应用程序。如下所示是独立的 Java 应用程序和 applet 程序之间重要的不同:Java 中 Applet 类继承了 java.......
Java rint() 方法
rint() 方法返回最接近参数的整数值。语法该方法有以下几种语法格式:double rint(double d)参数double 原始数据类型。返回值返回 double 类型数组,是最接近参数的整数值。实例实例public class Test{ public static void mai......
Redis CLIENT KILL 命令
Redis CLIENT KILL 命令关闭给定的客户端连接。CLIENT KILL - 语法以下是Redis CLIENT KILL 命令的基本语法。redis 127.0.0.1:6379> CLIENT KILL [ip:port] [ID client-id] [TYPE normal......
设计模式 拦截过滤器模式
拦截过滤器模式(Intercepting FilterPattern)用于对应用程序的请求或响应做一些预处理/后处理。定义过滤器,并在把请求传给实际目标应用程序之前应用在请求上。过滤器可以做认证/授权/记录日志,或者跟踪请求,然后把请求传给相应的处理程序。以下是这种设计模式的实体。过滤器(Filte......
Java sqrt() 方法
sqrt() 方法用于返回参数的算术平方根。语法double sqrt(double d)参数d -- 任何原生数据类型。返回值返回参数的算术平方根。实例public class Test{ public static void main(String args[]){ dou......
Ajax Java示例
要创建ajax示例,需要使用服务器端语言,例如:Servlet,JSP,PHP,ASP.Net等。这里使用JSP来生成服务器端代码。在这个例子中,只是打印给定数字的表。使 用jsp创建ajax示例的步骤需要按照以下步骤操作:加载org.json.jar文件。创建输入页面以接收文本或数字。创......
设计模式 过滤器模式
过滤器模式(Filter Pattern)或标准模式(CriteriaPattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。实现我们将创建一个 Person 对象、 C......
Java 条件语句
if 语句的用语法如下:if(布尔表达式){ //如果布尔表达式为true将执行的语句}如果布尔表达式的值为 true,则执行 if 语句中的代码块,否则执行 if 语句块后面的代码。Test.java 文件代码:public class Test { public static void ......
Java 运算符
计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。我们可以把运算符分成以下几组:算术运算符关系运算符位运算符逻辑运算符赋值运算符其他运算符算术运算符算术运算符用在数学表达式中,它们的作用和在数学中的作用一样。下表列出了所有的算术运算符。表格中的实......
Java subSequence() 方法
subSequence() 方法返回一个新的字符序列,它是此序列的一个子序列。语法public CharSequence subSequence(int beginIndex, int endIndex)参数beginIndex -- 起始索引(包括)。endIndex -- 结束索引(不包括)。返......
Java intern() 方法
intern() 方法返回字符串对象的规范化表示形式。它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。语法public String intern()参数无返回值一个字符串,内容与此......
Java 文档注释
Java 支持三种注释方式。前两种分别是 // 和 / / ,第三种被称作说明注释,它以 /** 开始,以 */ 结束。说明注释允许你在程序中嵌入关于程序的信息。你可以使用 javadoc 工具软件来生成信息,并输出到HTML文件中。说明注释,使你更加方便的记录你的程序信息。javadoc 标签ja......
Java Java 9 钻石操作符(Diamond Operator)
钻石操作符是在 java 7 中引入的,可以让代码更易读,但它不能用于匿名的内部类。在 java 9 中, 它可以与匿名的内部类一起使用,从而提高代码的可读性。考虑以下 Java 9 之前的代码:实例public class Tester { public static void main(St......
Java equals() 方法
equals() 方法用于判断 Number 对象与方法的参数进是否相等。语法public boolean equals(Object o)参数o -- 任何对象。返回值如 Number 对象不为 Null,且与方法的参数类型与数值都相等返回 True,否则返回 False。Double 和 Flo......
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!