设计模式之责任链模式(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就是我们的责任链,这就是简单的责任链模式!

原文地址:https://www.cnblogs.com/think-in-java/p/4746337.html