拦截过滤器模式(intercepting filter pattern)用于对应用程序的请求或响应做一些预处理/后处理。定义过滤器,并在把请求传给实际目标应用程序之前应用在请求上。过滤器可以做认证/授权/记录日志,或者跟踪请求,然后把请求传给相应的处理程序。以下是这种设计模式的实体。
我们将创建 filterchain、filtermanager、target、client 作为表示实体的各种对象。authenticationfilter 和 debugfilter 表示实体过滤器。
interceptingfilterdemo,我们的演示类使用 client 来演示拦截过滤器设计模式。
创建过滤器接口 filter。
filter.java
public interface filter { public void execute(string request); }
创建实体过滤器。
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); } }
创建 target。
target.java
public class target { public void execute(string request){ system.out.println("executing request: " + request); } }
创建过滤器链。
filterchain.java
import java.util.arraylist; import java.util.list; public class filterchain { private list filters = new arraylist(); 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; } }
创建过滤管理器。
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); } }
创建客户端 client。
client.java
public class client { filtermanager filtermanager; public void setfiltermanager(filtermanager filtermanager){ this.filtermanager = filtermanager; } public void sendrequest(string request){ filtermanager.filterrequest(request); } }
使用 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"); } }
验证输出。
authenticating request: home request log: home executing request: home