zoukankan      html  css  js  c++  java
  • 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 };

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

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

  • 相关阅读:
    000-ESP32学习开发(SDK)-ESP32开发板使用说明
    2-STM32 替换说明-CKS32, HK32, MM32, APM32, CH32, GD32, BLM32, AT32(推荐), N32, HC华大系列
    002-CH579M学习开发-官方资料学习说明,开发板蓝牙(蓝牙定位),网口通信测试
    001-CH579M学习开发-硬件使用说明,下载和运行第一个程序
    STM32+CH395Q(以太网)基本控制篇(自建物联网平台)-硬件使用说明
    17-网络芯片CH395Q学习开发-片内EEPROM读写实验
    16-网络芯片CH395Q学习开发-低功耗实验
    15-网络芯片CH395Q学习开发-DNS 域名解析
    14-1-网络芯片CH395Q学习开发-WEB服务器-网页到底是啥, web服务器是啥, 网页如何显示的显示图片和视频
    13-网络芯片CH395Q学习开发-模块使用Socket0作为MAC RAW
  • 原文地址:https://www.cnblogs.com/Sabo-dudu/p/14666579.html
Copyright © 2011-2022 走看看