Chain of Responsibility... JavaScript职责链模式( 三 )


另外,职责链模式使得程序中多了一些节点对象,可能在某一次的请求传递过程中,大部分节点并没有起到实质性的作用,它们的作用仅仅是让请求传递下去,从性能方面考虑,要避免过长的职责链带来的性能损耗
AOP
在之前的职责链实现中,利用了一个Chain类来把普通函数包装成职责链的节点 。其实利用JAVAscript的函数式特性,有一种更加方便的方法来创建职责链
下面改写一下Function.prototype.after函数,使得第一个函数返回'nextSuccessor'时,将请求继续传递给下一个函数,无论是返回字符串'nextSuccessor'或者false都只是一个约定,当然在这里也可以让函数返回false表示传递请求,选择'nextSuccessor'字符串是因为它看起来更能表达我们的目的,代码如下

Chain of Responsibility... JavaScript职责链模式

文章插图
 
用AOP来实现职责链既简单又巧妙,但这种把函数叠在一起的方式,同时也叠加了函数的作用域,如果链条太长的话,也会对性能有较大的影响
文件上传
迭代器模式中,有一个获取文件上传对象的例子:当时创建了一个迭代器来迭代获取合适的文件上传对象,其实用职责链模式可以更简单,完全不用创建这个多余的迭代器,完整代码如下
Chain of Responsibility... JavaScript职责链模式

文章插图
 
在JavaScript开发中,职责链模式是最容易被忽视的模式之一 。实际上只要运用得当,职责链模式可以很好地帮助我们管理代码,降低发起请求的对象和处理请求的对象之间的耦合性 。职责链中的节点数量和顺序是可以自由变化的,可以在运行时决定链中包含哪些节点
无论是作用域链、原型链,还是DOM节点中的事件冒泡,都能从中找到职责链模式的影子 。职责链模式还可以和组合模式结合在一起,用来连接部件和父部件,或是提高组合对象的效率
总结
优点
  1. 解耦了请求发送者和度个接收者之间的复杂关系,不需要知道链中哪个节点能处理你的请求,只需要把请求传递到第一个节点即可 。
  2. 链中的节点对象可以灵活地拆分重组,增加或删除一个节点,或者改变节点的位置都是很简单的事情 。
  3. 我们还可以手动指定节点的起始位置,并不是说非得要从其实节点开始传递的.
缺点
职责链模式中多了一点节点对象,可能在某一次请求过程中,大部分节点没有起到实质性作用,他们的作用只是让请求传递下去,从性能方面考虑,避免过长的职责链提高性能 。




推荐阅读