设计模式:Filter过滤器

原文地址:https://blog.csdn.net/u011697278/article/details/53729830

场景1: 

每种Filter进行某种处理,将各个Filter连在一起形成一个FilterChain。当需要往FilterChain中加入新的Filter,或者改变各个Filter的处理顺序时,可以方便的扩展。

1个接口:

public interface Filter {
    public String dofilter(String msg);
}
  • 1
  • 2
  • 3

3种实现类:

public class SensitiveWordFilter implements Filter{

    @Override
    public String dofilter(String msg) {
        return msg.replace("fuck", "f**k").replace("Fuck", "F**k");
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
public class StopWordFilter implements Filter{

    @Override
    public String dofilter(String msg) {
        return msg.replace("and", "").replace("to", "").replace("ing", "").replace("is", "");
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
public class FaceFilter implements Filter{

    @Override
    public String dofilter(String msg) {
        return msg.replace(":(", "^V^");
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

用1个FilterChain连接起来:

public class FilterChain implements Filter{

    List<Filter> filters = new ArrayList<Filter>();

    @Override
    public String dofilter(String msg) {
        String r = msg;
        for(Filter f : filters)
            r = f.dofilter(r);
        return r;
    }

    public FilterChain addFilter(Filter f){
        filters.add(f);
        return this;
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

main方法调用:

public class Main {

    public static void main(String[] args){

        String msg = "Today is raining. What a fucking day! :(";

        FilterChain fc = new FilterChain();
        fc.addFilter(new SensitiveWordFilter())
          .addFilter(new StopWordFilter())
          .addFilter(new FaceFilter());

        String result = fc.dofilter(msg);
        System.out.println(msg);
        System.out.println(result);

    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

场景2: 
客户端==>服务端,参照javax.servlet 
接口描述
调用流程

2种对象:

public class Request {
    public String requestSTR;
}

public class Response {
    public String responseSTR;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

1个Filter接口:

public interface Filter {
    public void dofilter(Request request,Response response, FilterChain fc);
}
  • 1
  • 2
  • 3

3种实现类:

public class SensitiveWordFilter implements Filter{

    @Override
    public void dofilter(Request request, Response response, FilterChain fc) {
        request.requestSTR = request.requestSTR.replace("fuck", "f**k").replace("Fuck", "F**k");
        request.requestSTR += "--SensitiveWordFilter()";
        fc.dofilter(request, response, fc);
        response.responseSTR += "--SensitiveWordFilter()";
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
public class StopWordFilter implements Filter{


    @Override
    public void dofilter(Request request, Response response, FilterChain fc) {
        request.requestSTR = request.requestSTR.replace("and", "").replace("to", "").replace("ing", "").replace("is", "");
        request.requestSTR += "--StopWordFilter()";
        fc.dofilter(request, response, fc);
        response.responseSTR += "--StopWordFilter()";
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
public class FaceFilter implements Filter{

    @Override
    public void dofilter(Request request, Response response, FilterChain fc) {
        request.requestSTR = request.requestSTR.replace(":(", "^V^");
        request.requestSTR += "--FaceFilter()";
        fc.dofilter(request, response, fc);
        response.responseSTR += "--FaceFilter()";
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

FilterChain

public class FilterChain implements Filter{

    List<Filter> filters = new ArrayList<Filter>();
    int index = 0;

    public FilterChain addFilter(Filter f){
        filters.add(f);
        return this;
    }


    @Override
    public void dofilter(Request request, Response response, FilterChain fc) {
        if(index == filters.size())
            return;
        Filter f = filters.get(index);
        index++;
        f.dofilter(request, response, this);
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

Main:

public class Main {

    public static void main(String[] args){

        Request request = new Request();
        request.requestSTR = "Today is raining. What a fucking day! :(";
        Response response = new Response();
        response.responseSTR = "";

        FilterChain fc = new FilterChain();
        fc.addFilter(new SensitiveWordFilter())
          .addFilter(new StopWordFilter())
          .addFilter(new FaceFilter());

        fc.dofilter(request,response,fc);
        System.out.println(request.requestSTR);
        System.out.println(response.responseSTR);

    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

Reference:马士兵java视频,设计模式

猜你喜欢

转载自blog.csdn.net/mask_v/article/details/79926624
今日推荐