>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 30271 个阅读者 刷新本主题
 * 贴子主题:  Java设计模式:拦截过滤器模式 回复文章 点赞(0)  收藏  
作者:flybird    发表时间:2019-08-16 20:14:28     消息  查看  搜索  好友  邮件  复制  引用

  

拦截过滤器模式

    拦截过滤器模式(Intercepting Filter Pattern)用于对应用程序的请求或响应做一些预处理/后处理。定义过滤器,并在把请求传给实际目标应用程序之前应用在请求上。过滤器可以做认证/授权/记录日志,或者跟踪请求,然后把请求传给相应的处理程序。以下是这种设计模式的实体。    
  • 过滤器(Filter) - 过滤器在请求处理程序执行请求之前或之后,执行某些任务。
  • 过滤器链(Filter Chain) - 过滤器链带有多个过滤器,并在 Target 上按照定义的顺序执行这些过滤器。
  • Target - Target 对象是请求处理程序。
  • 过滤管理器(Filter Manager) - 过滤管理器管理过滤器和过滤器链。
  • 客户端(Client) - Client 是向 Target 对象发送请求的对象。

实现

     我们将创建 FilterChain、FilterManager、Target、Client 作为表示实体的各种对象。AuthenticationFilter 和 DebugFilter 表示实体过滤器。

     InterceptingFilterDemo,我们的演示类使用 Client 来演示拦截过滤器设计模式。

    点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

步骤 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 < Filter >  filters  =  new   ArrayList < Filter > ( ) ;
    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



程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-02-15 12:22:01 重新编辑]
  Java面向对象编程-->泛型
  JavaWeb开发-->自定义JSP标签(Ⅱ)
  JSP与Hibernate开发-->域对象在持久化层的四种状态
  Java网络编程-->用Spring整合CXF发布Web服务
  精通Spring-->CSS过渡和动画
  Vue3开发-->通过Vuex进行状态管理
  java的三种随机数生成方式
  Java如何遍历Enumeration
  Java中保留数字的若干位小数位数的方法
  Java并发编程的总结与思考
  不修改源代码,动态注入Java代码的方法
  Eclipse和MyEclipse的区别
  Eclipse使用指南:工作空间(Workspace)
  用BigDecimal进行精确运算的范例
  java比c++强大之处JVM垃圾收集算法
  Java入门实用代码:删除链表中的元素
  Java 入门实用代码: 数组差集
  Java入门实用代码:字符串替换
  Java程序初始化顺序(一看就懂)
  【Java 并发笔记】CountDownLatch 相关整理
  类加载中的双亲委派模型
  更多...
 IPIP: 已设置保密
楼主      
1页 1条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。