javascript 职责链模式-紧密耦合判读变多函数分开处理
职责链模式是:是多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。如果是在jvascript中很好解决这个问题。 从编程上来说就是把比较复杂的if-else嵌套紧密的判断-执行逻辑使用高阶函数把判断语句中所做的事情放到函数中处理。
逻辑处理的复杂度并没有改变,但是各个处理部分就分散到函数中去了。每个函数只做两件事情,能处理就处理,不能处理就交给其他函数,或者把自己的逻辑,通过异步再通知下一个函数进行处理。 这样通过单个函数内部的指针简化紧密嵌套的逻辑。
我作为初学者感觉到这样处理,代码读起来非常清晰。但是执行的效率是不是和紧密嵌套的逻辑一样我就不知道了。或许是用时间换代码的易读性。
//实例来自《js设计模式与开发实践》
<script type="text/javascript">
var order500 = function( orderType, pay, stock ){
if ( orderType === 1 && pay === true ){//根据orderType,pay进行任务分配
console.log( '500 元定金预购, 得到100 优惠券' ); //符合order500条件,直接执行逻辑
}else{
//不符合order500条件交个order200处理,order500任务完成
order200( orderType, pay, stock ); // 将请求传递给200 元订单
}
};
// 200 元订单
var order200 = function( orderType, pay, stock ){
if ( orderType === 2 && pay === true ){//符合order200条件
console.log( '200 元定金预购, 得到50 优惠券' ); //执行逻辑
}else{
//条件不符合,传给下一个函数处理
orderNormal( orderType, pay, stock ); // 将请求传递给普通订单
}
};
// 普通购买订单
var orderNormal = function( orderType, pay, stock ){
if ( stock > 0 ){
console.log( '普通购买, 无优惠券' );
}else{
console.log( '手机库存不足' );
}
};
// 测试结果:
order500( 1 , true, 500); // 输出:500 元定金预购, 得到100 优惠券
order500( 1, false, 500 ); // 输出:普通购买, 无优惠券
order500( 2, true, 500 ); // 输出:200 元定金预购, 得到500 优惠券
order500( 3, false, 500 ); // 输出:普通购买, 无优惠券
order500( 3, false, 0 ); // 输出:手机库存不足
</script>