职责链模式
按顺序传递
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 阅读(88) 评论(0) 编辑 收藏 举报