`

过滤器模式

 
阅读更多
package com.otg.jason.filter.old;

/**
 * Created by jason.guan on 2017/7/16.
 */
public class FilterProcessor {
    String msg;

    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
    public String process(){
        //process html tag
        String r = msg.replace("<", "[")
                .replace(">", "]");
        //process the sensitive words
        r=r.replace("敏感", "XXXX");


        return r;
    }
}

 

package com.otg.jason.filter.old;

/**
 * Created by jason.guan on 2017/7/16.
 */
public class FilterProcessorTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String msg = "<html>,敏感信息,大家可以看见吗";
        FilterProcessor filterProcessor = new FilterProcessor();
        filterProcessor.setMsg(msg);
        String result = filterProcessor.process();
        System.out.println(result);
    }

}

 

[html],XXXX信息,大家可以看见吗

 

 

通过FilterProcessor的process对信息进行过滤,一旦发生新的需求,我们不得不修养这个方法,这就违背了对修改关闭,对扩张开发的设计思想,那么怎么办呢? 

 

package com.otg.jason.filter;

/**
 * Created by jason.guan on 2017/7/16.
 */
public interface Filter {
    void doFilter(Request request, Response response, FilterChain chain);
}
 
package com.otg.jason.filter;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by jason.guan on 2017/7/16.
 */
public class FilterChain implements Filter {
    List<Filter> filters = new ArrayList<Filter>();
    int index = 0;

    public FilterChain addFilter(Filter f) {
        this.filters.add(f);
        return this;
    }
    public void doFilter(Request request, Response response, FilterChain chain) {
        if(index == filters.size()) return ;
        Filter f = filters.get(index);
        index ++;
        f.doFilter(request, response, chain);
    }
}
 

 

分化了各个校验规则,提高了可扩展性.我们要实现链条的拼接,其实我们想想,一个Filter链条本身就是一个Filter,所以我们使用FilterChain来模拟Filter链条,并且实现了Filter接口,

 

package com.otg.jason.filter;

/**
 * Created by jason.guan on 2017/7/16.
 */
public class SesitiveFilter implements Filter {
    public void doFilter(Request request, Response response, FilterChain chain) {
        String requestStr = request.getRequestStr();
        String responseStr = requestStr.replace("敏感", "XXXX");
        request.setRequestStr(responseStr);
        response.setResponseStr(response.getResponseStr()+","+responseStr);
        chain.doFilter(request, response, chain);
    }
}

 

这样我们的Filterchain不仅可以添加一个个Filter,还能直接添加Filter链条,现在的问题是如何让我们的Filter也可以处理返回的信息呢?

 

package com.otg.jason.filter;

/**
 * Created by jason.guan on 2017/7/16.
 */
public class FilterMainTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String msg = "<html>,敏感信息,大家可以看见吗";
        Request request = new Request();
        request.setRequestStr(msg);
        Response response = new Response();
        response.setResponseStr("response");
        FilterChain fc = new FilterChain();
        fc.addFilter(new HTMLFilter())
                .addFilter(new SesitiveFilter());
        fc.doFilter(request, response, fc);
        System.out.println(request.getRequestStr());
        System.out.println(response.getResponseStr());
    }

}

 

要想让我们的Filter可以处理返回信息,很自然的想到让一个Filter去调用另外一个Filter,等到最后一个Filter返回,其余的也逐个返回,这里要完成这一过程,增加了

一个参数FilterChain,FilterChain里面记录了当前过滤器索引,巧妙的完成了一个Filter调用另外一个Filter的需求

分享到:
评论

相关推荐

    设计模式-过滤器模式

    过滤器模式,又称为Criteria模式或Specification模式,是一种在软件设计中常见的行为设计模式,它主要用来封装一系列的条件判断,使复杂的查询过程简化。在iOS开发中,过滤器模式可以用于处理数据筛选,比如在App中...

    拦截过滤器模式

    ### 拦截过滤器模式详解 #### 一、概述 **拦截过滤器模式(Intercepting Filter Pattern)**是一种软件设计模式,主要用于对应用程序的请求或响应进行预处理或后处理。它允许我们在请求到达目标组件之前或响应离开...

    【Java设计模式】拦截过滤器模式

    Java中的拦截过滤器模式是一种强大的设计模式,允许高效地处理Web请求。该模式支持在过滤器链中应用多个过滤器来处理和修改请求和响应。 ## 二、详细解释及实际示例 1. **实际示例**: - 考虑进入一个安全的办公...

    java常用设计模式-过滤器模式

    Java 过滤器模式详解 Java 过滤器模式(Filter Pattern)是一种常用的设计模式,用于在请求到达目标对象之前或之后,对请求进行处理或过滤。该模式可以用于实现不同的功能,如验证、授权、日志记录、压缩等,将不同...

    【Java设计模式】过滤器模式

    &gt; 想象一个图书馆系统使用过滤器模式来动态组合过滤标准,如类型、作者和可用性。这个Java模式使系统更具可维护性和可扩展性。图书馆系统不是为每个可能的标准组合编写单独的方法,而是采用过滤器设计模式。每个过滤...

    java的设计模式之过滤器模式.docx

    过滤器模式,也称为 Chain of Responsibility 模式,是一种行为设计模式,主要用于处理请求的过滤逻辑。在 Java 中,过滤器模式通常应用于网络请求、数据预处理或权限控制等场景。这种模式允许我们通过一系列相互...

    设计模式-拦截过滤器

    拦截过滤器模式是其中的一种行为设计模式,它在请求处理之前或之后执行一系列操作,提供了灵活且可扩展的方式来处理各种任务。这种模式在iOS平台上的应用同样广泛,尤其是在构建应用程序的架构时。 ### 拦截过滤器...

    管道过滤器程序,主要用java实现

    管道过滤器模式是一种设计模式,它在软件工程中被广泛应用于数据处理,特别是在Java编程语言中。这种模式通过连接一系列的处理组件(过滤器),每个组件执行特定的任务,来实现复杂的数据转换。在这个场景中,"管道...

    1道过滤器模式架构风格-课程内容.rar

    过滤器模式,也被称为“Criteria模式”或“多标准选择模式”,是一种设计模式,它允许我们根据多个条件对数据集合进行筛选。这种模式在软件工程中广泛应用,特别是在数据处理、数据库查询以及用户界面的交互中。下面...

    1道过滤器模式架构风格-MOOC课程内容.pdf

    管道过滤器模式是软件体系结构设计中的一种风格,它通过一系列独立的处理单元(即过滤器)和数据传输通道(即管道)来处理数据流。每个过滤器组件负责特定的数据处理功能,读取输入数据流,执行处理后输出新的数据流...

    java实际过滤器模式代码实例

    MsgProcessor是消息管理类,setMsg方法设置消息字符串。HTMLFilter的功能是将尖括号替换成中括号;SesitiveFilter的功能是将消息中的敏感词过滤掉;FaceFilter的功能是将笑脸替换成另一种表情符号。

    Java过滤器模式原理及用法实例

    **过滤器模式(Filter Pattern)**是软件设计中的一种**结构型模式**,它主要用于处理对象集合,通过一系列的过滤条件来筛选出满足特定需求的对象。在Java中,过滤器模式常常被用来处理数据筛选、预处理等场景,特别...

    管道过滤器(软件体系结构)

    良好的体系结构能够确保软件系统的成功部署与维护,而管道过滤器模式作为软件体系结构的一种常见形式,在诸多领域内得到了广泛的应用。 #### 管道过滤器模型 管道过滤器模型是一种面向数据流的软件体系结构,它...

    java 过滤器模式(Filter/Criteria Pattern)详细介绍

    过滤器模式(Filter/Criteria Pattern)是软件设计中的一种结构型模式,它的主要目的是通过定义一系列的过滤条件,对一组对象进行筛选,从而得到满足特定条件的对象子集。这种模式在处理复杂查询时非常有用,因为它...

    过滤器的编写

    过滤器模式是一种设计模式,它允许我们通过一系列的处理步骤(即过滤器)来改变输入数据,以满足特定的需求。在Web应用程序中,过滤器通常作为Servlet容器的一部分,如Tomcat或Jetty,它们在请求到达目标Servlet...

    【设计模式】(十八)–结构型模式–过滤器模式

    过滤器模式,也被称为Criteria模式,是设计模式中的一种结构型模式,它的主要目标是让开发者能够使用多种独立的标准来筛选一组对象,并且可以通过逻辑运算将这些标准串联起来,达到复合过滤的效果。这种模式在实际的...

    过滤器源代码

    3. **过滤器工作原理**:过滤器模式通常是一个观察者模式的变体,它允许我们对数据流进行拦截和处理,而不改变原有数据流的结构。在Web应用中,过滤器链常常被用来在请求到达目标Servlet之前执行某些操作,如身份...

    论文研究-管道、过滤器和MVC软件体系模式在J2EE中的应用.pdf

    在深入理解了这些知识点之后,我们可以看到,本文是通过将管道和过滤器模式以及MVC模式应用到J2EE平台中,来实现软件体系构架的优化和改进。文章不仅探讨了这些模式在J2EE中的具体实现和应用,还强调了它们在提升...

    java设计模式之过滤器模式.docx

    26 }27 }28 }FilterHolder一个过滤器链表实现:1 import java.util.ArrayList; 2 import java.util.List; 3 4 /** 5 * @title: DemoFilterChain 6 * @Author junyu 7 * 旧巷里有一个穿着白衬衫笑起来如太阳般温暖我...

Global site tag (gtag.js) - Google Analytics