js设计模式--行为型--策略模式
行为模式:策略模式
策略模式: 定义一系列的算法,把他们一个个封装起来,并且使它们可相互替换。
假设场景:有同一个商品,通过在后台给它设置不同的价格类型,让他展示不同的价格。
- 当价格类型为“预售价”时,满 100 - 20,不满 100 打 9 折
- 当价格类型为“大促价”时,满 100 - 30,不满 100 打 8 折
- 当价格类型为“返场价”时,满 200 - 50,不叠加
- 当价格类型为“尝鲜价”时,直接打 5 折
1 /** 2 * 预售价 - pre 3 * 大促销 - onSale 4 * 返厂价 - back 5 * 尝鲜价 - frech 6 */ 7 8 // 处理预售价 9 function prePrice(origin) { 10 if (origin >= 100) { 11 return origin - 20; 12 } 13 return originPrice * 0.9; 14 } 15 // 处理大促销 16 function onSalePrice(origin) { 17 if (origin >= 200) { 18 return origin - 30; 19 } 20 return origin * 0.8; 21 } 22 // 处理返厂价 23 function backPrice(origin) { 24 if (origin >= 200) { 25 return origin - 50; 26 } 27 return origin; 28 } 29 // 处理尝鲜价 30 function freshPrice(origin) { 31 return originPrice * 0.5; 32 } 33 34 function askPrice(tag, origin) { 35 if (tag === "pre") { 36 return prePrice(origin); 37 } 38 if (tag === "onSale") { 39 return onSalePrice(originPrice); 40 } 41 if (tag === "back") { 42 return backPrice(originPrice); 43 } 44 if (tag === "fresh") { 45 return freshPrice(originPrice); 46 } 47 }
假如新加一个 新用户的函数 newUser,那么在 askPrice 里面,还需要在添加一个if,我们还是在修改 askPrice 的函数体,没有实现 对外开放,对修改封闭 的效果。
把查询标签 -- 查询价格函数 这个映射确定下来,这里用到 对象映射。
1 /** 2 * 预售价 - pre 3 * 大促销 - onSale 4 * 返厂价 - back 5 * 尝鲜价 - frech 6 */ 7 // 定义一个查询价格处理器对象 8 // 把查询价格方法全部收敛写道一个对象里面 9 const priceProcessor = { 10 pre(originPrice) { 11 if (originPrice >= 100) { 12 return originPrice - 20; 13 } 14 return originPrice * 0.9; 15 }, 16 onSale(originPrice) { 17 if (originPrice >= 100) { 18 return originPrice - 30; 19 } 20 return originPrice * 0.8; 21 }, 22 back(originPrice) { 23 if (originPrice >= 200) { 24 return originPrice - 50; 25 } 26 return originPrice; 27 }, 28 fresh(originPrice) { 29 return originPrice * 0.5; 30 }, 31 }; 32 // 询价函数 33 function askPrice(tag, originPrice) { 34 return priceProcessor[tag](originPrice); 35 } 36 37 //如果你需要新人价,只需要给 priceProcessor 添加一个新的映射关系 38 priceProcessor.newUser = function (originPrice) { 39 if (originPrice >= 100) { 40 return originPrice - 50; 41 } 42 return originPrice; 43 };
下面方法是对上面方法的重构,这个重构的过程就是 策略模式 的应用。
策略模式中的行为函数是“ 潇洒 ”的行为函数,他们不依赖调用主体、相互平行、各自为政、相互独立的。