职责链模式
按顺序传递
if,else if else if else 的职责链。
最大的优点:弱化了发送者和一组接收者之间的强联系。
定义:每个对象都只负责往下面的 的对象抛请求。最后把函数包装进职责链节点。
优点:解耦链请求发送者和N个接收者之间的复杂关系。只有把请求传递给第一个节点即可。可拆卸和新增任意节点。
灵活可拆分的职责链节点。
//灵活的职责链
//定金500客户
var order500 = function( orderType, pay, stock ){
if( orderType == 1 && pay == true ){
console.log('定金500用户,得到100元优惠')
}else{
// order200( orderType, pay, stock );
return 'nextSucessor';
}
}
//定金500客户
var order200 = function( orderType, pay, stock ){
if( orderType == 2 && pay == true ){
console.log('定金200用户,得到50元优惠')
}else{
// orderNormal( orderType, pay, stock ); //普通购买
return 'nextSucessor';
//异步 手动设置
// var self = this;
// setTimeout(function(){
// self.next();
// },2000)
}
}
//普通购买
var orderNormal = function( orderType, pay, stock ){
if( stock > 0 ){
console.log('普通购买,无优惠劵')
}else{
// order200( orderType, pay, stock ); 测试,只需要传给第一个节点: order500( 1, true, 500 );
console.log('手机库存不足');
}
}
//构建灵活的职责链,将以上函数包装进 职责链节点。
var Chain = function( fn ){
this.fn = fn;
this.successor = null;
}
//指定链中的下一个节点
Chain.prototype.setNextSuccesstor = function( successor ){
return this.successor = successor;
}
//传递请求给下一个节点
Chain.prototype.passRequst = function(){
var ret = this.fn.apply( this, arguments );
if( ret == 'nextSucessor' ){
return this.successor && this.successor.passRequst.apply( this.successor, arguments );
}
return ret;
}
//适合异步的职责链,创建
Chain.prototype.next = function(){
return this.successor && this.successor.passRequst.apply( this.successor, arguments );
}
//三个节点。
var chainOrder500 = new Chain( order500 );
var chainOrder200 = new Chain( order200 );
var chainOrderNormal = new Chain( orderNormal );
chainOrder500.setNextSuccesstor( chainOrder200 );
chainOrder200.setNextSuccesstor( chainOrderNormal );
//请求:
chainOrder500.passRequst( 1, true, 500 );
//用AOP实现指责链。
Function.prototype.after = function( fn ){
var self = this;
return function(){
var ret = self.apply( this, arguments );
if( ret == 'nextSucessor' ){
return fn.apply( this, arguments );
}
return ret;
}
}
var order = order500.after( order200 ).after( orderNormal );
order( 1, true, 500 );
posted on 2017-06-28 15:08 rainbow661314 阅读(92) 评论(0) 收藏 举报
浙公网安备 33010602011771号