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 };

  下面方法是对上面方法的重构,这个重构的过程就是 策略模式 的应用。

  策略模式中的行为函数是“ 潇洒 ”的行为函数,他们不依赖调用主体、相互平行、各自为政、相互独立的。

原文地址:https://www.cnblogs.com/Sabo-dudu/p/14666579.html