拦截过滤器模式(intercepting filter pattern)用于对应用程序的请求或响应做一些预处理/后处理。定义过滤器,并在把请求传给实际目标应用程序之前应用在请求上。过滤器可以做认证/授权/记录日志,或者跟踪请求,然后把请求传给相应的处理程序。以下是这种设计模式的实体。
过滤器(filter) - 过滤器在请求处理程序执行请求之前或之后,执行某些任务。
过滤器链(filter chain) - 过滤器链带有多个过滤器,并在 target 上按照定义的顺序执行这些过滤器。
target - target 对象是请求处理程序。
过滤管理器(filter manager) - 过滤管理器管理过滤器和过滤器链。
客户端(client) - client 是向 target 对象发送请求的对象。
实现
我们将创建 filterchain、filtermanager、target、client 作为表示实体的各种对象。authenticationfilter 和 debugfilter 表示实体过滤器。
interceptingfilterdemo 类使用 client 来演示拦截过滤器设计模式。
步骤 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
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