var order = function( orderType, pay, stock ){
if ( orderType === 1 ){ // 500 元定?购买模式
if ( pay === true ){ // 已?付定?
console.log( ‘500 元定?预购, 得到 100 优惠券‘ );
} else{ // 未?付定?,降级到普通购买模式
if ( stock > 0 ){ // ?于普通购买的?机还有库存
console.log( ‘普通购买, ?优惠券‘ );
}else{
console.log( ‘?机库存不?‘ );
}
}
} else if ( orderType === 2 ){
if ( pay === true ){ // 200 元定?购买模式
console.log( ‘200 元定?预购, 得到 50 优惠券‘ );
}else{
if ( stock > 0 ){
console.log( ‘普通购买, ?优惠券‘ );
}else{
console.log( ‘?机库存不?‘ );
}
}
} else if (orderType === 3) {
if ( stock > 0 ){
console.log( ‘普通购买, ?优惠券‘ );
} else{
console.log( ‘?机库存不?‘ );
}
}
};
order( 1 , true, 500); // 输出: 500 元定?预购, 得到 100 优惠券
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( ‘?机库存不?‘ );
}
};
// Chain.prototype.setNextSuccessor 指定在链中的下?个节点
// Chain.prototype.passRequest 传递请求给某个节点
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‘ ){
return this.successor && this.successor.passRequest.apply(
this.successor, arguments );
}
return ret;
};
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 优惠券开课吧web全栈架构师
chainOrder500.passRequest( 3, true, 500 ); // 输出:普通购买,?优惠券
chainOrder500.passRequest( 1, false, 0 ); // 输出:?机库存不?
通过改进,我们可以?由灵活地增加
加、移除和修改链中的节点顺序,假如某天?站运营?员 ?想出了?
持 300 元定?购买,那我们就在该链中增加?个节点即可