职责链模式的定义是:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
职责链模式的名字非常形象,一系列可能会处理请求的对象被连接成一条链,请求在这些对象之间依次传递,直到遇到一个可以处理它的对象,我们把这些对象称为链中的节点
例子:
我们都知道公司里员工请假需要审批,假设不同部门的员工请假需要找到对应部门的主管进行审批。假设一个公司共有产品、设计、前端、后端几个部门,我们如果要判断某个员工请假该找谁审批的话,代码大概是这样子的:
1 | const stuff = { |
在这段代码中,每个if语句是一个节点,用来处理请求
接下来我们使用职责链模式来改写下这段代码,我们约定,如果某个处理节点不能处理请求,则返回一个特殊字符串’nextHandler’来表示该请求需要继续往后面传递
我们先把4个if语句分离出来,写成4个函数:
1 | function productApproval(dept) { |
接下来需要把函数包装进职责链节点,我们定义一个构造函数Chain,在new Chain的时候传递的参数即为需要被包装的函数,同时它还拥有一个实例属性this.nextHandler,表示在链中的下一个节点:
1 | function Chain(fn) { |
现在我们把四个函数包装成职责链中的节点,然后指定节点在职责链中的位置,最后把请求传递给第一个节点,请求会在节点之间传递,直到被处理
1 | const p = new Chain(productApproval) |
假如某天公司多了一个算法部门,我们在该链中增加一个节点即可:
1 | function algorithmApproval(dept) { |