简介
职责链模式进行顺序请求,使每个对象都有机会处理请求,避免请求者与接受者之间的耦合。沿着链条传递请求,直到有个对象能够处理它为止。
开发中的职责链模式
先考虑如下代码
function chain(item){
if(item===1){
console.log("执行方法1");
}else if(item===2){
console.log("不满足条件1,执行方法2");
}else{
console.log("不满足条件1、2,执行方法3");
}
}
上述代码想描述的是如果接受者1不满足者将请求交给接收者2,接受者2如果不满足者将请求交给接受者3,如果加上业务功能,那么后期的维护势必会存在非常大的问题。现在使用职责链模式重构如下:
function fn1(item){
if(item===1){
console.log("执行方法1");
}else{
fn2(item);
}
}
function fn2(item){
if(item===2){
console.log("执行方法2");
}else{
fn3(item);
}
}
function fn3(item){
console.log("执行方法1");
}
上述代码将大函数抽离为小的函数,但是违反了开放-封闭原则,fn1只能将请求交给fn2,fn2只能将请求交给fn3。
更加灵活的职责链
function fn1(item){
if(item===1){
console.log("执行方法1");
}else{
return 'next'
}
}
function fn2(item){
if(item===2){
console.log("执行方法2");
}else{
return 'next'
}
}
function fn3(item){
console.log("执行方法1");
}
function chain(fn){
this.next = null;
this.fn = fn;
}
chain.prototype.setNext = function(fn){
this.next = fn;
}
chain.prototype.pass = function(){
const ret = this.fn.apply(this,arguments);
if(ret==='next'){
return this.next&& this.next.pass.apply(this.next,arguments);
}
return ret
}
const chain1 = new chain(fn1);
const chain2 = new chain(fn2);
const chain3 = new chain(fn3);
chain1.setNext(chain2);
chain2.setNext(chain3);
// 然后将请求交给第一个节点
chain1.pass(2);
上述职责链可以自定义下一个节点,更加的灵活。
用AOP实现职责链模式
function fn1(item){
if(item===1){
console.log("执行方法1");
}else{
return 'next'
}
}
function fn2(item){
if(item===2){
console.log("执行方法2");
}else{
return 'next'
}
}
function fn3(item){
console.log("执行方法3");
}
Function.prototype.after = function(next){
const self = this;
return function(){
const ret = self.apply(this,arguments);
if(ret==='next'){
return next.apply(null,arguments);
}
return ret
}
}
const chain = fn1.after(fn2).after(fn3);
// 然后将请求交给第一个节点
chain(3);