0%

JavaScript设计模式--职责链模式

在组合模式中,事件或者对象经过父节点组件处理后,会向下传递给子节点,但是我们常常遇到这样的问题,我们接收到一个事件对象,但由于该对象的变化情况非常多样,如果每次都根据不同的情况做出不同处理,会造成代码上的严重耦合,此时,我们不如让函数自己去判断是否对该对象进行处理,也就是针对某个可变的一系列相似事件,构造一条职责链,职责链的每一节点负责不同的处理方式,甚至职责链的每个节点仍旧是一条职责链,这样就将时间发起者与事件处理者之间的耦合关系大大减弱。

在看到职责链模式的描述的时候,我首先想到的是redux中的reducer,reducer是一种简单的职责链的实现方式,但在构建react应用中发挥了巨大的作用,在每一个reducer中,都负责了不同数据的处理方式,reducer实现事件对象传递是非常粗暴的,即穷举法,对职责链中的每一个节点传入相同的参数然后返回得到的结果集,但得益于switch的高效,这种做法并不会对性能产生太大的影响。

redux中的中间件机制,也可以使用职责链来描述,但中间件之间传递事件对象时,则需要每个中间件将对象返回出去,这就对编写中间件的方式做了默认的约定,即返回结果的形式需要能够被下一级中间件使用。

著名的jQuery以链式调用为一大特色,其中也可以使用职责链模式来解释,只是此时的职责链传递的是事件发起者本身。

在组合模式中运用职责链时,可以将组合后的对象通过职责链连接起来,以优化事件对象的传递方向或者数据的流动方向。

脱离redux来讲,职责链模式的应用范围非常广泛,实现方式也是多种多样,但应当注意的是,职责链的每个节点应该各司其职,不要在某个职责链节点中调用相同职责链的其他节点,以免出现耦合,同时将事件处理流程的粒度进行细化。