zoukankan      html  css  js  c++  java
  • 设计模式之责任链模式(1)

    入正题,需求:假如我想对一些信息进行一定规则的过滤.

    首先定义一个Main类:

    package cn.asto.filter;
    
    public class Main {
    
        String str = "<script> hello 大家好! 敏感词汇!";
    }

    我想对javacript标签进行过滤,对敏感词汇进行过滤。

    定义MsgProcessor:

    package cn.asto.filter;
    
    public class MsgProcessor {
    
        private String msg;
        
        public String getMsg() {
            return msg;
        }
    
        public void setMsg(String msg) {
            this.msg = msg;
        }
    
        public String  process(){
            String result = msg.replace("<", "[").replace(">", "]");
            result = result.replace("敏感词汇", "根据法律,相关内容不能显示");
            return result;
        }
    }

    修改Main类:

    package cn.asto.filter;
    
    public class Main {
    
        public static void main(String args[]){
            String str = "<script> hello 大家好! 敏感词汇!";
            MsgProcessor msgProcessor = new MsgProcessor();
            msgProcessor.setMsg(str);
            String result = msgProcessor.process();
            System.out.println(result);
        }
        
    }

    输出:

    [script] hello 大家好! 根据法律,相关内容不能显示!

    看到html标签和敏感词汇被过滤掉了,很简单,就是定义了一个MsgProcessor,里面存一个msg,定义一个process方法用来替换相关字符,返回替换后的字符.

    这和责任链还扯得有点远了。继续往下走。上面的做法,我们没办法决定MsgProcessor中处理链。每当有一个新的过滤需求,就得重写一个MsgProcessor,多扯淡。

    现在定义一个Filer接口:

    package cn.asto.filter;
    
    public interface Filter {
    
        public String doFilter(String str);
    }

    写两个Filter类:

    SensitiveFilter:

    package cn.asto.filter;
    
    public class SensitiveFilter implements Filter{
    
        @Override
        public String doFilter(String str) {
            String result = str.replace("敏感词汇", "根据法律,相关内容不能显示!");
            return result;
        }
    
    }

    HtmlFilter:

    package cn.asto.filter;
    
    public class HtmlFilter implements Filter{
    
        @Override
        public String doFilter(String str) {
            String result = str.replace("<", "[").replace(">", "]");
            return result;
        }
    
    }

    定义一个FilterChain(FilterChain中就对装入的msg,做遍历List<Filter>doFilter方法,返回处理的结果):

    package cn.asto.filter;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class FilterChain implements Filter {
        
        List<Filter> filters = new ArrayList<Filter>();
        public FilterChain addFilter(Filter f){
            filters.add(f);
            return this;
        }
        @Override
        public String doFilter(String str) {
            for(Filter filter :filters){
                str = filter.doFilter(str);
            }
            return str;
        }
    
    }

    此时在MsgFilter要干点什么呢?

    装入一个msg(将要被处理的String),一条装上了几个Filter或者FilterChain的FilterChain,就可以了。

    package cn.asto.filter;
    
    public class MsgProcessor {
    
        private String msg;
        private FilterChain fc ;
        
        public String getMsg() {
            return msg;
        }
    
        public FilterChain getFc() {
            return fc;
        }
    
        public void setFc(FilterChain fc) {
            this.fc = fc;
        }
    
        public void setMsg(String msg) {
            this.msg = msg;
        }
        public String  process(){
            return fc.doFilter(msg);
        }
    }

    在main方法中,定义一个装了几个Filter的FilterChain链,定义一个要被处理的字符串,作为参数传入msgProcessor对象,调用process()返回结果。

    package cn.asto.filter;
    
    public class Main {
    
        public static void main(String args[]){
            String str = "<script> hello 大家好! 敏感词汇!";
            
            FilterChain fc = new FilterChain();
            fc.addFilter(new HtmlFilter()).addFilter(new SensitiveFilter());
            
            MsgProcessor msgProcessor = new MsgProcessor();
            msgProcessor.setMsg(str);
            
            msgProcessor.setFc(fc);
            String result = msgProcessor.process();
            System.out.println(result);
        }
        
    }

    写到这里有点责任链的味道了。哈哈

    上个图先:

    创建HtmlFilter,SensitiveFilter实例化FilterChain,将msg和FilterChain实例化对象传入MsgProcessor构造msgProcessor,调用msgProcessor.process方法,实际上就是调用了FilterChain.doFilter,在往上说,就是遍历调用FilterChain中的HtmlFilter和SensitiveFilter的doFilter方法。实现讲完了。

    来来来,我们来抽象一下过程。

    一条msg经过一条FilterChain链条的磨练,通过了党中央宪法的校验,成为了一条合理合法的result!

    这个FilterChain就是我们的责任链,这就是简单的责任链模式!

  • 相关阅读:
    js制作倒计时
    SpringBoot tomcat 上传文件大小受限制1M,解决办法
    SQL关于not,exists说法,以及差异
    SQL语句关于树查询
    树(Tree)形插件
    python之函数用法fromkeys()
    模块
    补充零散知识
    pickle模块
    python中元组与列表的区别
  • 原文地址:https://www.cnblogs.com/think-in-java/p/4746337.html
Copyright © 2011-2022 走看看