您当前的位置: 首页 > 

梁云亮

暂无认证

  • 2浏览

    0关注

    1211博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

责任链设计模式

梁云亮 发布时间:2019-10-26 18:26:04 ,浏览量:2

示例:实现网络请求中见的网络文本过滤功能,比如: 1、敏感字过滤 2、特殊字符过滤 3、Emoji表情过滤 ……

版本一
public static void main(String[] args) {
    String msg ="alert('这是一个差生凸^-^凸')";
    String res =  msg.replace('',']')
            .replaceAll("差生","后进生")
            .replace("凸^-^凸","伤心"); //此处必须得使用replace方法,不能使用replaceAll
    System.out.println(res);
}

结果: 在这里插入图片描述

版本二:专门抽取出来一个用来处理文本的工具类
  • 文件处理类

    public class MsgProcessor {
    
        private String msg;
    
        public void setMsg(String msg) {
            this.msg = msg;
        }
    
    
        public String process() {
            return msg.replace('', ']')
                    .replaceAll("差生", "后进生")
                    .replace("凸^-^凸", "伤心");
        }
    }
    
  • 测试类

    public class Demo {
        private static String msg ="alert('这是一个差生凸^-^凸')";
    
        public static void main(String[] args) {
            MsgProcessor processor = new MsgProcessor();
            processor.setMsg(msg);
            String res = processor.process();
            System.out.println(res);
        }
    }
    
版本三:针对每一种文本过滤功能提供单独的类
  • 针对文本过滤功能提供一个统一的Filter接口

    public interface MsgFilter {
        String doFilter(String msg);
    }
    
  • 过滤敏感字的功能类

    public class SensitiveFilter implements  MsgFilter {
        @Override
        public String doFilter(String msg) {
            return msg.replaceAll("差生", "后进生");
        }
    }
    
  • 过滤特殊字符的功能类

    public class HtmlFilter implements MsgFilter {
        @Override
        public String doFilter(String msg) {
            return msg.replace('', ']');
        }
    }
    
  • 过滤Emoji表情的功能类

    public class EmojiFilter implements MsgFilter {
        @Override
        public String doFilter(String msg) {
            return msg.replace("凸^-^凸", "伤心");
        }
    }
    
  • 调用过滤器实现文本过滤的类

    public class MsgProcessor {
    
        private String msg;
    
        public void setMsg(String msg) {
            this.msg = msg;
        }
    
        private MsgFilter[] filters = {new HtmlFilter(),new SensitiveFilter(),new EmojiFilter()};
    
        public String process() {
            for(MsgFilter filter : filters){
                msg = filter.doFilter(msg);
            }
            return msg;
        }
    }
    
  • 测试代码

    public class Demo {
        private static String msg ="alert('这是一个差生凸^-^凸')";
    
        public static void main(String[] args) {
            MsgProcessor processor = new MsgProcessor();
            processor.setMsg(msg);
            String res = processor.process();
            System.out.println(res);
        }
    }
    
版本四:将过滤器链加入到过滤器中

在这里插入图片描述

  • 添加新的类FilterChain,用来模拟责任链功能

    public class FilterChain implements MsgFilter {
        List filters = new ArrayList();
    
        public FilterChain addFilter(MsgFilter filter) {
            filters.add(filter);
            return this;
        }
    
        @Override
        public String doFilter(String msg) {
            for (MsgFilter filter : filters) {
                msg = filter.doFilter(msg);
            }
            return msg;
        }
    }
    
  • 修改MsgProcessor类

    public class MsgProcessor {
    
        private String msg;
        private FilterChain filterChain;
    
        public void setMsg(String msg) {
            this.msg = msg;
        }
    
        public void setFilterChain(FilterChain filterChain) {
            this.filterChain = filterChain;
        }
    
        public String process() {
            return  filterChain.doFilter(msg);
        }
    }
    
  • 测试代码:

    public class Demo {
        private static String msg = "alert('这是一个差生凸^-^凸')";
    
        public static void main(String[] args) {
            FilterChain filterChain1 = new FilterChain();
            filterChain1.addFilter(new SensitiveFilter());
            filterChain1.addFilter(new HtmlFilter());
    
            FilterChain filterChain2 = new FilterChain();
            filterChain2.addFilter(new EmojiFilter());
    
            filterChain1.addFilter(filterChain2);
    
            MsgProcessor processor = new MsgProcessor();
            processor.setMsg(msg);
            processor.setFilterChain(filterChain1);
    
            String res = processor.process();
            System.out.println(res);
        }
    }
    
版本5:模拟tomcat中消息从客户端发往服务器端,服务器端也有反馈的功能
  • Filter接口:

    public interface MsgFilter {
        void doFilter(Request request,Response response,FilterChain filterChain);
    }
    
  • 特殊字符过滤类

    public class HtmlFilter implements MsgFilter {
        @Override
        public void doFilter(Request request,Response response,FilterChain filterChain) {
           request. msg =   request.msg.replace('', ']')+" --HtmlFilter() ";
            filterChain.doFilter(request,response,filterChain);
    
            response.msg += "-- HtmlFilter() ";
        }
    }
    
  • 敏感字过滤类

    public class SensitiveFilter implements  MsgFilter {
        @Override
        public void doFilter(Request request,Response response,FilterChain filterChain) {
            request. msg =   request.msg.replaceAll("差生", "后进生")+" --SensitiveFilter() ";
            filterChain.doFilter(request,response,filterChain);
    
            response.msg += "-- SensitiveFilter() ";
        }
    }
    
  • Emoji过滤类

    public class EmojiFilter implements MsgFilter {
        @Override
        public void doFilter(Request request,Response response,FilterChain filterChain) {
            request. msg =   request.msg.replace("凸^-^凸", "伤心")+" --EmojiFilter() ";
            filterChain.doFilter(request,response,filterChain);
    
            response.msg += "-- EmojiFilter() ";
        }
    }
    
  • 过滤器链

    public class FilterChain implements MsgFilter {
        int index = 0;
        List filters = new ArrayList();
    
        public FilterChain addFilter(MsgFilter filter) {
            filters.add(filter);
            return this;
        }
    
        @Override
        public void doFilter(Request request,Response response,FilterChain filterChain) {
            if(index == filters.size()) {
                return;
            }
            MsgFilter filter = filters.get(index);
            index ++;
            filter.doFilter(request,response,filterChain);
        }
    }
    
  • 测试代码

    public class Demo {
    
    
        private static String msg = "alert('这是一个差生凸^-^凸')";
    
        public static void main(String[] args) {
            Request request = new Request();
            request.msg = msg;
            Response response = new Response();
            response.msg  = "response: ";
    
    
            FilterChain filterChain = new FilterChain().addFilter(new SensitiveFilter())
                    .addFilter(new HtmlFilter())
                    .addFilter(new EmojiFilter());
    
            filterChain.doFilter(request,response,filterChain);
    
            System.out.println(request.msg);
            System.out.println(response.msg);
        }
    }
    

结果: 在这里插入图片描述

关注
打赏
1665409997
查看更多评论
立即登录/注册

微信扫码登录

0.0476s