ntercepting Filter类似于职责链模式
有两种实现
其中一种是Filter之间没有联系,全部Filter都存放在FilterChain中,由FilterChain来有序或无序地把把所有Filter调用一遍。没有用到链表这种数据结构。示例如下:
Java代码 收藏代码
package com.ljn.filter.custom;
import java.util.ArrayList;
import java.util.List;
/**
* 由FilterManager组织FilterChain,在FilterChain里面的filter顺序执行,
* 各Filter之间没有交互
*/
public class InterceptingFilterManager {
interface Filter {
void execute(String request, String response);
}
static class AuthenticationFilter implements Filter {
@Override
public void execute(String request, String response) {
System.out.println("AuthenticationFilter");
}
}
static class DebugFilter implements Filter {
@Override
public void execute(String request, String response) {
System.out.println("DebugFilter");
}
}
static class Target {
public void execute(String request, String response) {
System.out.println("Target");
}
}
static class FilterChain {
private List<Filter> filters = new ArrayList<Filter>();
private Target target;
public void addFilter(Filter filter) {
filters.add(filter);
}
//顺序执行,各filter之间没有直接联系
public void execute(String request, String response) {
for (Filter filter : filters) {
filter.execute(request, response);
}
target.execute(request, response);
}
public void setTarget(Target target) {
this.target = target;
}
}
public static void main(String[] args) throws Exception {
Target target = new Target();
Filter debugFilter = new DebugFilter();
Filter authenticationFilter = new AuthenticationFilter();
FilterChain chain = new FilterChain();
chain.addFilter(authenticationFilter);
chain.addFilter(debugFilter);
chain.setTarget(target);
String req = null;
String res = null;
chain.execute(req, res);
}
}
另一种是一个Filter“持有”下一个Filter,下一个Filter的调用由上一个Filter决定。这其中就用到了链表这种数据结构。
Java代码 收藏代码
package com.ljn.filter.custom;
/**
* 结合装饰模式,每个filter完成自己的处理后,显式调用下一个filter
*/
public class InterceptingFilterDecorator {
interface Filter {
void execute(String request, String response);
}
static class AuthenticationFilter implements Filter {
private Filter next;
public AuthenticationFilter(Filter next) {
this.next = next;
}
@Override
public void execute(String request, String response) {
System.out.println("AuthenticationFilter");
next.execute(request, response);
}
}
static class DebugFilter implements Filter {
private Filter next;
public DebugFilter(Filter next) {
this.next = next;
}
@Override
public void execute(String request, String response) {
System.out.println("DebugFilter");
next.execute(request, response);
}
}
static class Target implements Filter {
@SuppressWarnings("unused")
private Filter next;
public Target() {
this(null);
}
public Target(Filter next) {
this.next = next;
}
@Override
public void execute(String request, String response) {
System.out.println("Target");
// next.execute(request, response); //last one, no need to call next
}
}
public static void main(String[] args) throws Exception {
Filter processor = new AuthenticationFilter(
new DebugFilter(
new Target()));
String req = null;
String res = null;
processor.execute(req, res);
}
}
分享到:
相关推荐
"J2EE设计模式精解"着重讨论了如何利用这些模式来构建健壮的、可扩展的Web应用程序。在给定的部分内容中,我们关注的是"拦截过滤器"(Intercepting Filter)模式,这是Core J2EE Patterns中的一个重要概念。 **拦截...
在J2EE设计模式部分,文档提到的是Intercepting Filter模式,这是一种在Web应用中处理请求和响应的架构模式。它允许开发者对客户端的请求和响应进行预处理和后处理,满足安全性、性能和其他的业务逻辑需求。文档描述...
用Java实现23种设计模式 1. 创建型模式 工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern)...
标题《Core J2EE Patterns Best Practices And Design Strategies》和描述部分介绍了软件设计模式的重要性,将设计模式比喻为一个组织的“部落记忆”的有形体现。设计模式是解决常见问题的通用解决方案,它源自之前...
这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。 工厂模式(Factory Pattern) 抽象工厂模式...
- 拦截过滤器(Intercepting Filter):用于在请求达到目标组件之前进行预处理。 - 前台控制器(Front Controller):作为所有请求的入口点,统一处理流程。 - 环境对象(Environment Object):提供对系统环境...
它通过一套经过验证的设计模式,为开发者提供了处理特定问题的标准化方案,从而大大提高了软件开发的效率和质量。 ### 模式与OOAD 面向对象分析与设计(OOAD)是J2EE模式的重要基石。OOAD不仅提供了一种统一的语言...
J2EE 模式是一系列专门针对 Java EE 应用程序的设计模式。 #### MVC 模式(MVC Pattern) 模型-视图-控制器(Model-View-Controller)模式将应用程序分为三个基本部分:模型、视图和控制器。这种模式有助于分离...
### Core J2EE Patterns:拦截过滤器模式 (Intercepting Filter) #### 背景与情境 在J2EE环境中,请求处理机制需要处理多种类型的客户端请求,这些请求可能涉及不同的处理逻辑。例如,某些请求可能直接转发到相应...