分享

GoF设计模式之十三 Chain of Responsibility- -

 wtf_soft 2005-07-22

 

                                      

    这里开始是第三部分-行为模式。前面讲过的创建模式是与对象的创建有关的,结构模式是关于对象的继承、依赖以及扩展的,这部分模式是协调对象与对象之间结构关系的。
    C1) Chain of Responsibility(职责链)
    定义:通过给一个以上对象处理请求的机会来避免请求的发送者和接收者的耦合。链接接收对象并在链中传递请求直到有对象处理它。
    这个模式的使用频率属于中等,可能由于有时候出于效率的考虑,不使用这个模式。因为链表结构势必每个请求都要从第一个节点开始传递,而有可能最后一个节点才会处理这个请求,这样处理性能大打折扣。通常,这种情况下,都喜欢使用运用这个模式概念的过程语法if...elseif...else或者更加形象化的switch-case语法。但如果接收对象对于开发者来说是未知的,我们就无法将其过程化,还必须借助面向对象的强大的扩展能力。
    最常见的应用就是Filter(过滤器),我就不自己举例了,直接来看javax.servlet包中的Filter.java,代码去掉注释如下:
    public interface Filter {
        public void init(FilterConfig filterConfig) throws ServletException;
        public void doFilter ( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException;
        public void destroy();
    }

    关注一下doFilter方法,request对象就是所说的请求,而chain对象(FilterChain)就是一个过滤器对象组成的链,在实现Filter接口时,对于doFilter的实现如下:
    public void doFilter ( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException {
        //处理请求request
        chain.doFilter(request, response); //调用链表中下一个过滤器对象
    }

    如果需要,chain.doFilter(request, response);可以不要,也就是当自己处理完请求后,就结束传递,避免处理结果被后面的对象修改,但在Filter中不推荐这么做。
    如果每个接收对象都需要处理请求的某一部分,就可以将不同的处理功能放在不同的对象里面,对单一处理的改动也非常方便。如此,层次清晰分工明确,的确是非常漂亮的行为模式,我个人也比较喜欢这个模式。


   参考:
1、 http://www./designpatterns/cor.htm(中文、java实例)
2、 http://www./Patterns/PatternChain.aspx(英文、C#实例、UML)
3、 http://www.caterpillar./PmWiki/pmwiki.php/DesignPattern/ChainofResponsibility(中文、java实例、UML)推荐
4、 http://www./tech/DesignPattern/ChainOfResponsibility.html
(日文、java实例、UML)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多