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

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

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

  • 相关阅读:
    为什么大多数IOC容器使用ApplicationContext,而不用BeanFactory
    重温Java泛型,带你更深入地理解它,更好的使用它!
    看完了这篇,面试的时候人人都能单手撸冒泡排序!
    JAVA基础4---序列化和反序列化深入整理(Hessian序列化)
    VS Code 变身小霸王游戏机!
    equals()方法和hashCode()方法详解
    openFeign远程调用时使用Mybatis-plus的IPage接口进行返回分页数据失败的记录
    通过express快速搭建一个node服务
    UML 类图
    jdk命令行工具系列——检视阅读
  • 原文地址:https://www.cnblogs.com/Sabo-dudu/p/14666579.html
Copyright © 2011-2022 走看看