`
rmzdb
  • 浏览: 81684 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

【设计模式说开去系列】--责任链模式

 
阅读更多
    网络上有不少关于介绍设计模式的文章,关于设计模式,也有不少的书本。描述的惟妙惟肖。但凡新的事物,好的思想。吃别人的现成饭,总是有种填鸭式的被动。只有自己领悟的东西,才是自己的。这里闲着没事,写点乱起七八糟的东西,一来为交流思想,一来希望能为新人带来点不一样的东西。写的不好,见谅少拍砖。

    自己也是新人过来的,当新人提到模式,或许这些新的名词,多多少少有点觉得很有权威,科技含量充足。咱们国家的改革开放,成功经验,啥的,也喜欢套用这样的词,曾几何时,沸沸扬扬的“广东模式”、“重庆模式”,在合适的基础上,有所成功,变成了推广与成功的典型。百度一下模式一词,模式(Pattern)其实就是解决某一类问题的方法论。把解决某类问题的方法总结归纳到理论高度,那就是模式。模式是一种指导,在一个良好的指导下,有助于你完成任务,有助于你作出一个优良的设计方案,达到事半功倍的效果。而且会得到解决问题的最佳办法。

    经济的发展,有发展模式。对于我们在代码上操刀的,就有相应的设计模式。说白了。模式是用来解决问题的,并取得成效的用以推广的。核心的东西,其实也并不是很神秘的,不是在高坛上下不来的。下面我们就收拾我们的心情,从责任链这一模式,扯起。

    责任链(Chain of Responsibility),我不想教条的把定义解释给大家听。光看字义,责任,是需要做事情的,是需要承担的义务的,我们叫责任;链,我们想到一连串的东西:链条、数据结构中有链式结构、甚至你都会想到三国杀的铁索连环。我们可以简单的认为责任链就是 做事情组成一个链式结构。就像春节一样,大家排着长长的队伍,要做的事情,就是买票。还有个比较搞笑的例子。我记得香港以前有部电影,叫《最佳女婿》,好像还是年轻的歌神主演的。讲的是兄弟三跟一个女的一夜激情之后,女子意外怀孕,不知道谁才是孩子真正的爸爸,这时三兄弟都争着想对女方负责任,后来女方的老爸假意说娃生病了,要治疗需要花很多钱。后来一个平时就老实巴交的男子敢于承担责任,最终经受住考验,嫁给了他。这个我认为已经是很贴切的而生动的例子。如果还可以再贴切一点,就是这么一幕,电影里三兄弟一字排开,女方的老爸先问第一个,“你愿意做这个病孩子的父亲吗?”老大不语,pass掉,老爸再问第二个,pass掉,再问第三个,他答应了,好,敢于承担责任,好!那你就是最佳女婿了。三个人组成了一个链,都做着同样的事情,就是敢不敢承担责任。在代码中,我们就可以把这里共同要做的事情抽象成一个方法。这就是一个责任链模式。
    扯到这里,有些开发者,可能就会考虑到J2EE开发时,常会用到过滤器的。没错,这就是责任链的应用。
 
  public class TestFilter implements Filter{

    public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain chain) throws IOException, ServletException {
        
        chain.doFilter(request, response);  
    }

    public void destroy() {
    }

    public void init(FilterConfig filterConfig) throws ServletException {
    }

}
  
这里的dofilter方法就是要的我们所说的“责任”,他在链条中传递,不是所有人都能负责,就像上面的三兄弟,不是每个人都能当人家的女婿的。

    撇开这里,我们再举一例,我们在学习网络的时候,我们知道网络协议可以广义的分为四层。从应用层->网络层->数据链路层->物理层。每一层都有对应的协议。我们分发一条数据,都是从上一层吧数据包加上协议头和协议尾进行数据包封装后,交由下一层。下一层再进行相应的处理,一直到数据分发在介质上传递。很简单,这里传递的人责任就是“数据包”。经过层层的封装,就变成了最后的数据。每一层组成了一个链路。
    既然说开去,我们就大胆一点,我们用java的iterator,迭代器是不是可以认为就是一个责任链。每一次迭代,就是在传递“责任”。然后你又想了,那么递归函数是不是也是一个呢?然后你会想到链式的线性结构,会不会是一个呢?
    到这里,你已经开始接触真相了。责任链说到底就是一个链式的线性结构。每个结构中的对象都做着同样的事情。
   然后你会想到什么?类的加载器?什么时候加载本地的类,什么时候加载类库,什么时候加载网络的,他们之间有个顺序,就构成了java的加载机制。加载了,后面的类就不再加载了,这样就保障了java的安全性。java的异常捕获? 为什么一定要先捕获子类的,catch的时候为什么一定是从特定的异常开始,最后才变成一般的异常,也是爷爷级的异常Exception呢?捕获是个“责任”,在父子继承关系组成的链路中传递。这就成了java的异常捕获机制。浏览器的事件机制也同样的。抛开语言级别的,你可能还会想到什么呢?工作流?每个节点都有自己的任务要执行,在预定义的流程中传递。spring的拦截器,等等等等。
   
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics