当前位置:首页 > 开发 > 编程语言 > 设计模式 > 正文

J2EE设计模式-Intercepting Filter

发表于: 2013-11-27   作者:bylijinnan   来源:转载   浏览:
摘要: Intercepting Filter类似于职责链模式 有两种实现 其中一种是Filter之间没有联系,全部Filter都存放在FilterChain中,由FilterChain来有序或无序地把把所有Filter调用一遍。没有用到链表这种数据结构。示例如下: package com.ljn.filter.custom; import java.util.ArrayList;
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);
    }

}

J2EE设计模式-Intercepting Filter

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
概述 J2EE目前的设计模式有一类由Sun Java Center管理,其已经定义了15种设计模式,并且在《Core J2
设计模式 - C++ - Pipe/Filter模式 1. 管道/过滤器模式的现实意义 Chris说:不多说,直接上图,看不
package com.design.model.adapter; //目标1 interface IJpan { public String provid110V(); } //
DAO(Data Access Objects)设计模式是属于J2EE体系架构中的数据层的操作。 一、为什么要用DAO? 比较
目前大多数企业采用J2EE技术简化企业应用解决方案的开发,部署和管理等复杂问题。对于我们学习和研
如图所示,对于一个指定了过滤器的Web资源(Servlet、JSP、HTML)来说,过滤器拦在客户端与Web资源
如图所示,对于一个指定了过滤器的Web资源(Servlet、JSP、HTML)来说,过滤器拦在客户端与Web资源
如图所示,对于一个指定了过滤器的Web资源(Servlet、JSP、HTML)来说,过滤器拦在客户端与Web资源
如图所示,对于一个指定了过滤器的Web资源(Servlet、JSP、HTML)来说,过滤器拦在客户端与Web资源
简介 Filter这个词第一个看到时以为是化学里面的漏斗呢,因为所学专业经常在实验室里面做一些实验,
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号