-
-
Save 303182519/212aa86db8effd625532f6ce3a543750 to your computer and use it in GitHub Desktop.
职责链模式
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 职责链模式 | |
var Chain = function( fn ){ | |
this.fn = fn; | |
this.successor = null; | |
}; | |
Chain.prototype.setNextSuccessor = function( successor ){ | |
return this.successor = successor; | |
}; | |
Chain.prototype.passRequest = function(){ | |
var ret = this.fn.apply( this, arguments ); | |
if ( ret === 'nextSuccessor' ){ | |
if( this.successor && this.successor.passRequest ) { | |
return this.successor.passRequest.apply( this.successor, arguments ); | |
}else { | |
return this.successor() | |
} | |
} | |
return ret; | |
}; | |
Chain.prototype.next= function(){ | |
return this.successor && this.successor.passRequest.apply( this.successor, arguments ); | |
}; | |
// -------------start 异步------------ | |
var order500 = function( orderType, pay, stock ){ | |
if ( orderType === 1 && pay === true ){ | |
console.log( '500 元定金预购,得到 100 优惠券' ); | |
}else{ | |
return 'nextSuccessor'; // 我不知道下一个节点是谁,反正把请求往后面传递 | |
} | |
}; | |
var order200 = function( orderType, pay, stock ){ | |
if ( orderType === 2 && pay === true ){ | |
console.log( '200 元定金预购,得到 50 优惠券' ); | |
}else{ | |
return 'nextSuccessor'; // 我不知道下一个节点是谁,反正把请求往后面传递 | |
} | |
}; | |
var orderNormal = function( orderType, pay, stock ){ | |
if ( stock > 0 ){ | |
console.log( '普通购买,无优惠券' ); | |
}else{ | |
console.log( '手机库存不足' ); | |
} | |
}; | |
//现在我们把 3 个订单函数分别包装成职责链的节点: | |
var chainOrder500 = new Chain( order500 ); | |
var chainOrder200 = new Chain( order200 ); | |
var chainOrderNormal = new Chain( orderNormal ); | |
//然后指定节点在职责链中的顺序: | |
chainOrder500.setNextSuccessor( chainOrder200 ); | |
chainOrder200.setNextSuccessor( chainOrderNormal ); | |
//最后把请求传递给第一个节点: | |
chainOrder500.passRequest( 1, true, 500 ); // 输出: 500 元定金预购,得到 100 优惠券 | |
chainOrder500.passRequest( 2, true, 500 ); // 输出: 200 元定金预购,得到 50 优惠券 | |
chainOrder500.passRequest( 3, true, 500 ); // 输出:普通购买,无优惠券 | |
chainOrder500.passRequest( 1, false, 0 ); // 输出:手机库存不足 | |
// -------------end 异步------------ | |
// -------------start 异步------------ | |
var fn1 = new Chain(function(){ | |
console.log( 1 ); | |
return 'nextSuccessor'; | |
}); | |
var fn2 = new Chain(function(){ | |
console.log( 2 ); | |
var self = this; | |
setTimeout(function(){ | |
self.next(); | |
}, 1000 ); | |
}); | |
var fn3 = new Chain(function(){ | |
console.log( 3 ); | |
}); | |
fn1.setNextSuccessor( fn2 ).setNextSuccessor( fn3 ); | |
fn1.passRequest(); | |
// -------------end 异步------------ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment