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

      刚刚认真开始学java不超过半年时间,现在在学习struts2框架,接触到了责任链这个设计模式,并通过这个模式似乎明白了aop切面编程,因为如果没有责任链存在的话,则程序不会从中被断很多次,但是有了这个链子,就像把一个很流畅的程序切了很多次一样,我很喜欢这个名字,话不多说了,介绍责任链:(下面这个例子是看马士兵老师的视频里面讲到的)

      比如要写一个论坛,论坛上肯定是要发帖子的,我们想对刚发的帖子进行检查,看是不是有脚本程序,或者对一些敏感的词进行过滤,可以设计如下:

    定义一个接口Filter:让每实现一个过滤功能的类都实现这个接口,则假设现在有两个实现类,HTMLFilter和SensitiveFilter,它们的代码如下

    接口:

    package ChainOfResponsibility;

    public interface Filter {
    void doFilter(Request request,Response response,FilterChain fc);
    }

    HTMLFilter类:

    package ChainOfResponsibility;

    public class HTMLFilter implements Filter {

    @Override
    public void doFilter(Request request,Response response,FilterChain fc) {
    request.setRequestStr(request.getRequestStr().replace("<", "[").replace(">", "]")+"------HTMLFilter");
    fc.doFilter(request, response, fc);
    response.setResponseStr(response.getResponseStr()+"-----HTMLFilter");
    // return request.getRequestStr();
    }


    }

    SensitiveFilter类:

    package ChainOfResponsibility;

    public class SensitiveFilter implements Filter {

    @Override
    public void doFilter(Request request,Response response,FilterChain fc) {
    request.setRequestStr(request.getRequestStr().replace("爆力", "")+"-----SensitiveFilter") ;
    fc.doFilter(request, response, fc);
    response.setResponseStr(response.getResponseStr()+"-----SensitiveFilter");
    // return request.getRequestStr();
    }

    }

    再定义一个Filter的大管家,这个大管家里有一个ArrayList(),里面放的是Filter,则可以运用多态,很方便的对实现Filter的类进行管理,这个大管家当然也可以实现Filter接口,这样就可以加很多个实现了Filter接口的类的对象到大管家里,这个大管家里有除了有set和get方法外,还有两个方法,代码如下:

    大管家FilterChain类:

    package ChainOfResponsibility;

    import java.util.ArrayList;
    import java.util.List;

    public class FilterChain implements Filter{
    private List<Filter> filters = new ArrayList<Filter>();
    int index = 0;

    public List<Filter> getFilters() {
    return filters;
    }

    public void setFilters(List<Filter> filters) {
    this.filters = filters;
    }

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

    public void doFilter(Request request,Response response,FilterChain fc){
    if(index >= fc.getFilters().size())
    return;
    Filter f = fc.getFilters().get(index);
    index++;
    f.doFilter(request, response, fc);

    // return request.getRequestStr();
    }

    }

    add方法是将想要新的过滤功能时,采用的方法,doFilter方法是这个类的重要方法,它的作用是控制ArrayList里的Filter的执行顺序和一个非常非常重要的作用,就是当一个东西传进来时,我想先对它进行所有的过滤,然后服务器再返回给我一个Response,这个Response是之前过滤时执行的反顺序,这时就要先定义一个Request类和一个Response类,然后在测试类里将大管家FilterChain,Request,Response三个类同时传入到大管家的doFilter方法是执行,具体执行则是先执行arrayList中的第0个元素的Filter,再返回来执行大管家的doFilter方法,然后再执行第1个元素的doFilter方法,再返回来执行大管家的doFilter方法,直到把所有的arrayList里的元素会部执行完,返回response时,过滤它就会按照与request过滤时反序执行了,如果还不明白,就看代码吧!

    Request类:

    package ChainOfResponsibility;

    public class Request {
    private String requestStr;

    public String getRequestStr() {
    return requestStr;
    }

    public void setRequestStr(String requestStr) {
    this.requestStr = requestStr;
    }

    }

    Response类:

    package ChainOfResponsibility;

    public class Response {
    private String responseStr="response";

    public String getResponseStr() {
    return responseStr;
    }

    public void setResponseStr(String responseStr) {
    this.responseStr = responseStr;
    }

    }

    测试类:

    package ChainOfResponsibility;

    public class Test {

    /**
    * @param args
    */
    public static void main(String[] args) {
    String msg = "hello world <script> 爆力 哈哈哈哈哈哈。。。。。";
    Request request = new Request();
    Response response = new Response();
    request.setRequestStr(msg);
    FilterChain fc = new FilterChain();

    fc = fc.addFilter(new HTMLFilter())
    .addFilter(new SensitiveFilter());

    fc.doFilter(request,response,fc);
    System.out.println(request.getRequestStr());
    System.out.println(response.getResponseStr());
    }

    }

    好不容易弄明白的,一定要把它记下来,以防忘了的时候可以再回来查看!

    还是第一次自己写博客,感觉不错,下次应该还会再写,嘿嘿

     

  • 相关阅读:
    浮动与浮动的清除
    【最全】经典排序算法(C语言)
    Python类中的self到底是干啥的
    浅析Python3中的bytes和str类型
    Shell十三问[转]
    VMware下对虚拟机Ubuntu14系统所在分区sda1进行磁盘扩容
    C语言运算符优先级
    mysql主要性能监控指标
    sql 优化
    npm install安装时忘记--save解决方法
  • 原文地址:https://www.cnblogs.com/lilyjia/p/3734777.html
Copyright © 2011-2022 走看看