[设计模式] javascript 之 责任链模式
责任链模式:定义
责任链接模式又称职责链模式,是一种对象的行为模式;它是一种链式结构,每个节点都有可能两种操作,要么处理该请求停止该请求操作,要么把请求转发到下一个节点,让下一个节点来处理请求;该模式定义了一些可能的处理请求的节点对象,请求的起点跟顺序都可能不一样,处理的节点根据请求的不一样而不同;请求者不必知道数据处理完成是由谁来操作的,内部是一个黑箱的操作过程,这是它的一个核心内容;
责任链模式:角色
抽象处理者角色:定义处理方法,以配置是否具有下个节点(Handler)对象;
具体处理者角色:定义处理方法的具体执行逻辑,判断是否可以处理该请求,如果可以就处理(返回结果结束);如果不行,就查看是有下个节点,有的话就传递给下家;
使用场景
比如公司采购申请,比如说部门或团队旅游申请等等,一切可能需要经过几个流程直到某个流程节点能够处理它为止的情况;
部门最近因为某个项目需要采购一批设备,价值可能在几十万左右,部门经理让其下的同事A,上OA写了个采购申请;这个申请首先进入采购部负责人这里,由于金额很大,他没办法直接处理(当然他还可以写下意见),就转交上级公司总经理处理,总经理有权处理这么大金额的采购,就写个同意就通过了;
如果总经理也没有处理这种金额的权限,也就只能再转交更上层董事长来处理决定;
当然,这其中可能遇到特殊情况,比如说采购部负责人不在,项目又非常着急;又或者这个大项目是总经理直接监督负责的,但是又需按流程有记录,就可以发个OA,直接将这个采购跳过采购部,直接到总经理这边。
模型结构
事例源码
1. 抽象处理者角色:
function Handler() { this.next = null; this.setNext = function(_handler) { this.next = _handler; }; this.handleRequest = function(money) { } }; //采购部 function CGBHandler = function() {} CGBHandler.prototype = new Handler(); CGBHandler.prototype.handleRequest = function(money) { //处理权限最多10000 if (money < 10000){ console.log('同意'); } else { console.log('金额太大,只能处理一万以内的采购'); if (this.next) { this.next.handleRequest(money); } } }; //总经理 function ZJLHandler = function() {} ZJLHandler .prototype = new Handler(); ZJLHandler .prototype.handleRequest = function(money) { //处理权限最多100000 if (money < 100000){ console.log('10万以内的同意'); } else { console.log('金额太大,只能处理十万以内的采购'); if (this.next) { this.next.handleRequest(money); } } }; //董事长 function DSZHandler = function() {} DSZHandler .prototype = new Handler(); DSZHandler .prototype.handleRequest = function(money) { //处理权限至少100000 if (money >= 100000){ console.log('10万以上的我来处理'); //处理其他逻辑 } };
客户端使用
function Client() { var cgb = new CGBHandler(); var zjl = new ZJLHandler(); var dsz = new DSZHandler(); cgb.setNext(zjl); zjl.setNext(dsz); cgb.handleRequest(800000); }
其他说明
责任链模式,总的一个核心就是请求者不必知道是谁哪个节点对象处理的请求,由于处理请求的可以不同对象下处理,所以请求者跟接受者是解耦的。
纯的责任链:要求请求在这些对象链中必须被处理,而且一个节点处理对象,要么只处理请求,要么把请求转发给下个节点对象处理;
不纯的责任链:要求在责任链里不一定会有处理结构,而且一个节点对象,即可以处理部分请求,并把请求再转发下个节点处理;