责任链模式

作者: 01_小小鱼_01 | 来源:发表于2018-05-24 23:51 被阅读49次

    责任链模式是将请求的处理对象像一条长链一般组合起来,形成一条对象链。请求并不知道具体执行请求的对象是哪一个,这样就实现了请求与处理对象之间的解耦。

    我们有一个字符串String msg = ":):,<script>,敏感,被就业,网络授课";我们希望应用以下三个规则对字符串进行过滤和谐处理:
    (1)将字符串中出现的"<>"符号替换成"[]"
    (2)处理字符串中的敏感信息,将被就业和谐成就业
    (3)将字符串中出现的":):"转换成"V";
    字符串会依次运用这三条规则,对字符串进行处理,每个规则都有自己需要完成的责任和任务。

    第一步:定义封装请求的类Request和封装处理结果响应的类Response

    //封装请求的类Request
    public class Request {
        String requestStr;
        public String getRequest() {
            return requestStr;
        }
        public void setRequest(String request) {
            this.requestStr = request;
        }
    }
    
    //封装响应信息的类Response
    public class Response {
        String responseStr;
        public String getResponse() {
            return responseStr;
        }
        public void setResponse(String response) {
            this.responseStr = response;
        }
    }
    

    第二步:定义具有过滤功能的接口Filter,具体的过滤规则需要实现该接口

    /*
     * 定义接口Filter,具体的过滤规则需要实现这个接口,最后一个参数添加的意义是我们在Main函数中:
     * fc.doFilter(request, response,fc);执行这一步的时候可以按照规则链条一次使用三个过滤规
     * 则对字符串进行处理
     * 
     */
    public interface Filter {
        void doFilter(Request request,Response response,FilterChain chain);
    }
    

    第三步:定义具体的过滤处理规则

    package com.bjsxt.dp.filter;
    
    //处理字符串中的HTML标记
    public class HTMLFilter implements Filter {
        public void doFilter(Request request, Response response,FilterChain chain) {
            //将字符串中出现的"<>"符号替换成"[]"
            request.requestStr=request.requestStr
                    .replace('<', '[').replace('>', ']')+
                    //后面添加的是便于我们观察代码执行步骤的字符串
                    "----HTMLFilter()";
            chain.doFilter(request, response,chain);
            response.responseStr+="---HTMLFilter()";
        }
    }
    
    package com.bjsxt.dp.filter;
    
    //定义的过滤敏感字眼的过滤规则
    public class SensitiveFilter implements Filter{
        public void doFilter(Request request, Response response,FilterChain chain) {
            //处理字符串中的敏感信息,将被就业和谐成就业
            request.requestStr=request.requestStr
                    .replace("被就业", "就业").replace("敏感", "")+
                    //后面添加的是便于我们观察代码执行步骤的字符串
                    " ---sensitiveFilter()";
            chain.doFilter(request, response,chain);
            response.responseStr+="---sensitiveFilter()";
        }
    }
    
    package com.bjsxt.dp.filter;
    
    //定义FaceFilter
    public class FaceFilter implements Filter {
        public void doFilter(Request request, Response response, FilterChain chain) {
            //将字符串中出现的":):"转换成"^V^";
            request.requestStr = request.requestStr.replace(":):", "^V^")
                    //后面添加的是便于我们观察代码执行步骤的字符串
                    + "----FaceFilter()";
            chain.doFilter(request, response, chain);
            response.responseStr += "---FaceFilter()";
        }
    }
    
    package com.bjsxt.dp.filter;
    
    import java.util.ArrayList;
    import java.util.List;
    
    //过滤链条
    public class FilterChain implements Filter{
        //用List集合来存储过滤规则
        List<Filter> filters = new ArrayList<Filter>();
        //用于标记规则的引用顺序
        int index=0;
        //往规则链条中添加规则
        public FilterChain addFilter(Filter f) {
            filters.add(f);
            //代码的设计技巧:Chain链添加过滤规则结束后返回添加后的Chain,
            //方便我们下面doFilter函数的操作
            return this;
        }
        public void doFilter(Request request,Response response,FilterChain chain){
            //index初始化为0,filters.size()为3,不会执行return操作
            if(index==filters.size()){
                return;
            }
            //每添加一个过滤规则,index自增1
            Filter f=filters.get(index);
            index++;
            //根据索引值获取对应的规律规则对字符串进行处理
            f.doFilter(request, response, chain);
        }
    }
    

    第五步:测试一下我们的代码

    package com.bjsxt.dp.filter;
    
    /*
     * 责任链模式:
     * 数据消息在进入数据库之前,要被多种过滤规则进行处理,多种规则形成一种链,依次处理
     * 给定的数据消息
     */
    public class Main {
        public static void main(String args[]) {
            //设定过滤规则,对msg字符串进行过滤处理
            String msg = ":):,<script>,敏感,被就业,网络授课";
            //过滤请求
            Request request=new Request();
            //set方法,将待处理字符串传递进去
            request.setRequest(msg);
            //处理过程结束,给出的响应
            Response response=new Response();
            //设置响应信息
            response.setResponse("response:");
            //FilterChain,过滤规则形成的拦截链条
            FilterChain fc=new FilterChain();
            //规则链条添加过滤规则,采用的是链式调用
            fc.addFilter(new HTMLFilter())
            .addFilter(new SensitiveFilter())
            .addFilter(new FaceFilter());
            //按照FilterChain的规则顺序,依次应用过滤规则
            fc.doFilter(request, response,fc);
            //打印请求信息
            System.out.println(request.getRequest());
            //打印响应信息
            System.out.println(response.getResponse());
            /*
             * 处理器对数据进行处理
             * --|----|---数据--|-----|--- 
             * 规则1      规则2                 规则3       规则4
             */
        }
    }
    

    运行结果:

    V,[script],,就业,网络授课----HTMLFilter() ---sensitiveFilter()----FaceFilter()
    response:---FaceFilter()---sensitiveFilter()---HTMLFilter()

    转载自:Java设计模式系列之责任链模式

    相关文章

      网友评论

      本文标题:责任链模式

      本文链接:https://www.haomeiwen.com/subject/obdrrftx.html