`

J2EE设计模式-Intercepting Filter

阅读更多
Intercepting Filter类似于职责链模式
有两种实现
其中一种是Filter之间没有联系,全部Filter都存放在FilterChain中,由FilterChain来有序或无序地把把所有Filter调用一遍。没有用到链表这种数据结构。示例如下:

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决定。这其中就用到了链表这种数据结构。

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);
    }

}

0
0
分享到:
评论

相关推荐

    J2EE 设计模式精解_EN

    "J2EE设计模式精解"着重讨论了如何利用这些模式来构建健壮的、可扩展的Web应用程序。在给定的部分内容中,我们关注的是"拦截过滤器"(Intercepting Filter)模式,这是Core J2EE Patterns中的一个重要概念。 **拦截...

    123种JAVA设计模式和15种J2EE设计模式.pdf

    在J2EE设计模式部分,文档提到的是Intercepting Filter模式,这是一种在Web应用中处理请求和响应的架构模式。它允许开发者对客户端的请求和响应进行预处理和后处理,满足安全性、性能和其他的业务逻辑需求。文档描述...

    用Java实现23种设计模式

    用Java实现23种设计模式 1. 创建型模式 工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern)...

    Core j2ee Patterns Best Practices And Design Strategies

    标题《Core J2EE Patterns Best Practices And Design Strategies》和描述部分介绍了软件设计模式的重要性,将设计模式比喻为一个组织的“部落记忆”的有形体现。设计模式是解决常见问题的通用解决方案,它源自之前...

    33种JAVA设计模式DEMO

    这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。 工厂模式(Factory Pattern) 抽象工厂模式...

    Java™ 2 平台高级核心模式, 企业版(J2EE™) 模式和重构

    - 拦截过滤器(Intercepting Filter):用于在请求达到目标组件之前进行预处理。 - 前台控制器(Front Controller):作为所有请求的入口点,统一处理流程。 - 环境对象(Environment Object):提供对系统环境...

    J2EE Patterns

    它通过一套经过验证的设计模式,为开发者提供了处理特定问题的标准化方案,从而大大提高了软件开发的效率和质量。 ### 模式与OOAD 面向对象分析与设计(OOAD)是J2EE模式的重要基石。OOAD不仅提供了一种统一的语言...

    设计模式.docx

    J2EE 模式是一系列专门针对 Java EE 应用程序的设计模式。 #### MVC 模式(MVC Pattern) 模型-视图-控制器(Model-View-Controller)模式将应用程序分为三个基本部分:模型、视图和控制器。这种模式有助于分离...

    Core J2EE Patterns(英文版)

    ### Core J2EE Patterns:拦截过滤器模式 (Intercepting Filter) #### 背景与情境 在J2EE环境中,请求处理机制需要处理多种类型的客户端请求,这些请求可能涉及不同的处理逻辑。例如,某些请求可能直接转发到相应...

Global site tag (gtag.js) - Google Analytics