`

责任链模式(Chain of Responsibility)

阅读更多
责任链模式(Chain of Responsibility)的目标是使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。

在处理用户的请求时可能要根据不同的情况对请求添加不同的处理逻辑,在这时候就可以利用责任链进行设计。当需要添加一个处理逻辑时可以很方便的添加一个处理的节点。

现在我们的需求是处理用户的请求,将用户提交的字符串信息进行层层处理,同时在处理完成之后返回结果时,也要对返回的字符串进行层层处理,而处理返回的情况时其处理的顺序和先前是正好相反的顺序。

首先建立用户的请求和接收对象Request和Response:

package com.lcq.filter;  
 
public class Request {  
    String requestStr;  
 
    public String getRequestStr() {  
        return requestStr;  
    }  
 
    public void setRequestStr(String requestStr) {  
        this.requestStr = requestStr;  
    }  
 
}  

package com.lcq.filter;  
 
public class Response {  
    String responseStr;  
 
    public String getResponseStr() {  
        return responseStr;  
    }  
 
    public void setResponseStr(String responseStr) {  
        this.responseStr = responseStr;  
    }  
 
}  

我们将处理用户信息的逻辑抽象成为一个个的过滤器,进一步抽象出过滤器接口Filter:

package com.lcq.filter;  
 
public interface Filter {  
    public void doFilter(Request request, Response response,FilterChain chain);  
 
}  

注意在Filte接口中doFilter方法参数中有FilterChain的一个变量,我们再建立FilterChain类:

package com.lcq.filter;  
 
import java.util.ArrayList;  
import java.util.List;  
 
public class FilterChain implements Filter {  
    List<Filter> filters = new ArrayList<Filter>();  
    int index = 0;  
 
    public FilterChain addFilter(Filter f) {  
        this.filters.add(f);  
        return this;  
    }  
 
    @Override 
    public void doFilter(Request request, Response response, FilterChain chain) {  
        if (index == filters.size())  
            return;  
        Filter f = filters.get(index);  
        index++;  
        f.doFilter(request, response, chain);  
    }  
}  

在FilterChain中继承了Filter接口,从而实现了doFilter方法,在FilterChain中又有一个index变量,该变量是用来标记当前访问的是哪一个过滤器,这些过滤器是存放在ArrayList中的,这样用户在使用的时候就可以实现自己的过滤器,编写自己的处理逻辑,从而将自己的过滤器添加到ArrayList中,再调用FilterChain的doFilter方法遍历整个责任链。

下面我们编写三个过滤器:

HTMLFilter类:

package com.lcq.filter;  
 
/**  
 * 过滤HTML中的脚本元素  
 * @author lcq  
 *  
 */ 
public class HTMLFilter implements Filter {  
 
    @Override 
    public void doFilter(Request request, Response response,FilterChain chain) {  
        request.requestStr = request.getRequestStr().replace("<", "[")  
                .replace(">", "] --------HTMLFilter");  
        chain.doFilter(request, response, chain);  
        response.responseStr += "--------HTMLFilter";  
          
    }  
 
}  

SesitiveFilter类:

package com.lcq.filter;  
 
public class SesitiveFilter implements Filter {  
 
    @Override 
    public void doFilter(Request request, Response response, FilterChain chain) {  
        request.requestStr = request.getRequestStr().replace("敏感", "  ")  
                .replace("猫猫", "haha------SesitiveFilter");  
        chain.doFilter(request, response, chain);  
        response.responseStr += "------SesitiveFilter";  
 
    }  
 
}  

FaceFilter类:

package com.lcq.filter;  
 
public class FaceFilter implements Filter {  
 
    @Override 
    public void doFilter(Request request, Response response, FilterChain chain) {  
        request.requestStr = request.getRequestStr().replace(":)",  
                "^V^-------FaceFilter");  
        chain.doFilter(request, response, chain);  
        response.responseStr += "-------FaceFilter";  
 
    }  
 
}  

最后编写测试类:

package com.lcq.filter;  
 
public class Main {  
    public static void main(String[] args) {  
        String message = "敏感词汇,重庆,<script> 躲猫猫 :)";  
        Request request = new Request();  
        request.setRequestStr(message);  
        Response response = new Response();  
        response.setResponseStr("response");  
        FilterChain fc = new FilterChain();  
        fc.addFilter(new HTMLFilter()).addFilter(new SesitiveFilter());  
 
        FilterChain fc2 = new FilterChain();  
        fc2.addFilter(new FaceFilter());  
        fc.addFilter(fc2);  
        fc.doFilter(request, response,fc);  
        System.out.println("request = " + request.getRequestStr());  
        System.out.println("response = " + response.getResponseStr());  
    }  
 
}  

在上面的实例中应该注意两个地方:

1.我们建立的FilterChain中继承了Filter接口,所以在测试类中就可以像使用其他的过滤器一样使用FilterChain,大大提高了灵活性;

2.对于实现责任链的访问处理顺序问题,该问题的解决使用的是递归的思想,从而使先调用的结点在处理返回结果时其调用过滤器的顺序是相反的。这种解决方案在Struts和其他框架中实现过滤器和拦截器使用的较为普遍,并且十分巧妙。
分享到:
评论

相关推荐

    设计模式C++学习之责任链模式(Chain of Responsibility)

    责任链模式(Chain of Responsibility)是一种行为设计模式,它允许将请求沿着处理者对象的链进行传递,直到某个对象能够处理这个请求。这种模式的主要优点是解耦了发送者和接收者之间的关系,使得系统更加灵活,...

    c++-设计模式之责任链模式(Chain of Responsibility Pattern)

    责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许将请求的发送者和接收者解耦。通过将请求沿着处理链传递,直到有对象处理该请求为止,这种模式避免了请求发送者与具体处理者之间的紧...

    java设计模式之责任链(chain of responsibility)

    责任链(Chain of Responsibility)模式是一种行为设计模式,它允许我们向对象链中传递请求,让每个对象决定是否处理这个请求。在Java中,这种模式常用于事件处理、日志系统或者权限控制等场景,其核心思想是将处理...

    Chain of Responsibility 职责链模式

    C#面向对象设计模式 Chain of Responsibility 职责链模式 视频讲座下载

    Chain of Responsibility模式

    这个模式的主要目的是允许在对象之间传递请求,同时避免将接收者硬编码到发送者中,使得多个对象有机会处理一个请求,形成一个责任链。 ### 一、模式概念 在Chain of Responsibility模式中,请求的发送者将请求...

    (行为型模式) Chain Of Responsibility 职责链模式

    C#面向对象设计模式 (行为型模式) Chain Of Responsibility 职责链模式 视频讲座下载

    【Java设计模式】(3)责任链Chain of Responsibility

    **Java设计模式——责任链(Chain of Responsibility)** 在软件工程中,设计模式是一种解决常见问题的可重用解决方案。责任链模式是行为设计模式之一,它的主要思想是将请求的发送者和接收者解耦,通过将多个处理...

    Chain Of Responsibility模式

    Chain of Responsibility(责任链)模式是一种行为设计模式,它允许将请求沿着处理者对象的链进行发送,每个对象都可以处理请求或将其传递给链中的下一个对象。这种模式常用于事件处理或者命令的执行流程,使得多个...

    chain of responsibility.pptx

    责任链模式(Chain of Responsibility Pattern)是一种常见的行为模式。 使多个对象都有处理请求的机会,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象串成一条链,并沿着这条链一直传递该请求,直到有...

    设计模式 - Chain of Responsibility Pattern(责任链模式)

    NULL 博文链接:https://linkcqu.iteye.com/blog/355806

    chain of responsibility 职责链模式(行为模式)

    职责链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许将请求的发送者和接收者解耦,使得多个对象都有可能处理一个请求,而无需显式指定接收者。在这个模式中,请求沿着一个处理者链进行传递,...

    Java设计模式之责任链模式(Chain of Responsibility模式)介绍

    责任链模式(Chain of Responsibility,CoR)是一种行为设计模式,它允许将请求沿着处理者对象的链式结构进行传递,直到某个对象处理这个请求。每个处理者对象都包含对下一个处理者的引用,如果当前处理者无法处理...

    chain-of-responsibility-demo 责任链模式demo

    在这个`chain-of-responsibility-demo`中,我们可以预期找到一个实际应用了责任链模式的代码示例。通常,它会包含以下关键组件: 1. **Handler**(处理器):这是责任链中的基本单元,每个处理器都实现了处理请求的...

    C#面向对象设计模式纵横谈(20):(行为型模式) Chain Of Responsibility 职责链模式

    职责链模式(Chain of Responsibility)是一种行为型设计模式,它允许将请求沿着处理者对象的链进行传递,直到某个对象能够处理这个请求。在C#中,职责链模式的应用可以帮助我们构建灵活、可扩展的系统,减少对象...

    C#面向对象设计模式纵横谈(14):Chain of Responsibility 职责链模式(行为型模式) (Level 300)

    职责链模式(Chain of Responsibility)是一种行为型设计模式,它允许你将请求沿着处理者对象的链进行传递,直到某个对象处理该请求。在C#编程中,职责链模式能够帮助我们实现一种松耦合的架构,使得请求的发送者和...

    责任链模式_javaDemo

    责任链模式(Chain of Responsibility)的目标是使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。 在处理用户的...

    C#面向对象设计模式纵横谈(14):Chain of Responsibility 职责链模式(行为型模式)

    ### C#面向对象设计模式纵横谈(14):Chain of Responsibility 职责链模式(行为型模式) #### 概述 在本篇文章中,我们将深入探讨C#中的Chain of Responsibility(职责链)模式,这是行为型设计模式的一种。虽然标题...

    C++面向对象23种设计模式实现源码DesignPattern.zip

    21.责任链模式Chain of Responsibility与C++的异常处理机制有相似之处,展示了如何构建一个处理链,让请求在对象间传递。 8. **状态模式(State Pattern)**:状态模式允许对象在其内部状态改变时改变其行为。15....

    JAVA设计模式之行为模式 责任链模式和状态模式

    本篇将探讨两种重要的行为设计模式:责任链模式(Chain of Responsibility Pattern)和状态模式(State Pattern)。 **责任链模式**是一种使多个对象都有机会处理请求的模式,避免请求发送者与接收者之间的耦合。在...

Global site tag (gtag.js) - Google Analytics