1+ 职责链模式的最大优点就是解耦了 请求发送者 和 N个接收者 之间的复杂关系
2+ 由于不知道链中的哪个节点可以处理发出的请求,所以只需把请求传递给第一个节点即可
3+ 无论是作用域链、原型链,还是 DOM 节点中的事件冒泡,我们都能从中找到职责链模式的影子
4+
5+ 1 对 N 环形关系 ===> 链式关系
6+
7+ < script >
8+ /**
9+ * 【 反面教材 】
10+ * 定金购买:如果支付了500元定金得100优惠券,如果支付了200元定金得50元优惠券,没有成功支付定金的没有优惠券且有库存限制
11+ */
12+ // 传入用户 订单类型 / 是否支付定金 / 库存
13+ var order = function ( orderType , pay , stock ) {
14+ // 500 元定金购买模式
15+ if ( orderType === 1 ) {
16+ // 已支付定金
17+ if ( pay === true ) { console . log ( '500 元定金预购, 得到100 优惠券' ) ; }
18+ // 未支付定金,降级到普通购买模式
19+ else {
20+ // 用于普通购买的手机还有库存
21+ if ( stock > 0 ) { console . log ( '普通购买, 无优惠券' ) ; }
22+ else { console . log ( '手机库存不足' ) ; }
23+ }
24+ }
25+ // 200 元定金购买模式
26+ else if ( orderType === 2 ) {
27+ if ( pay === true ) { console . log ( '200 元定金预购, 得到50 优惠券' ) ; }
28+ else {
29+ if ( stock > 0 ) { console . log ( '普通购买, 无优惠券' ) ; }
30+ else { console . log ( '手机库存不足' ) ; }
31+ }
32+ }
33+ // 普通模式购买
34+ else if ( orderType === 3 ) {
35+ if ( stock > 0 ) { console . log ( '普通购买, 无优惠券' ) ; }
36+ else { console . log ( '手机库存不足' ) ; }
37+ }
38+ } ;
39+ order ( 1 , true , 5 ) ; // 输出: 500 元定金预购, 得到100 优惠券
40+
41+ /**
42+ * 优化:链式调用,仍然不推荐!!!违反开闭原则
43+ */
44+ var order500 = function ( orderType , pay , stock ) {
45+ if ( orderType === 1 && pay === true ) {
46+ console . log ( '500 元定金预购, 得到100 优惠券' ) ;
47+ } else {
48+ order200 ( orderType , pay , stock ) ; // 将请求传递给200 元订单
49+ }
50+ } ;
51+ // 200 元订单
52+ var order200 = function ( orderType , pay , stock ) {
53+ if ( orderType === 2 && pay === true ) {
54+ console . log ( '200 元定金预购, 得到50 优惠券' ) ;
55+ } else {
56+ orderNormal ( orderType , pay , stock ) ; // 将请求传递给普通订单
57+ }
58+ } ;
59+ // 普通购买订单
60+ var orderNormal = function ( orderType , pay , stock ) {
61+ if ( stock > 0 ) {
62+ console . log ( '普通购买, 无优惠券' ) ;
63+ } else {
64+ console . log ( '手机库存不足' ) ;
65+ }
66+ } ;
67+ // 测试结果:
68+ order500 ( 1 , true , 0 ) ; // 输出:500 元定金预购, 得到100 优惠券
69+ order500 ( 2 , true , 0 ) ; // 输出:200 元定金预购, 得到500 优惠券
70+ order500 ( 3 , false , 1 ) ; // 输出:普通购买, 无优惠券
71+ order500 ( 3 , false , 0 ) ; // 输出:手机库存不足
72+
73+ </ script >
0 commit comments