js中如何用策略模式替换条件判断

策略模式通过将条件判断逻辑封装为独立策略类,使代码更清晰、易维护。1.定义策略接口,声明算法方法;2.创建具体策略类实现接口;3.环境类持有策略并执行;4.客户端通过环境类动态选择策略。适用于多条件分支且频繁变动的场景,如订单折扣、支付方式等。优点是符合开闭原则,缺点是类数量增加,客户端需了解所有策略。

js中如何用策略模式替换条件判断

策略模式,简单说,就是把一堆 if...else 或者 switch...case 语句,变成一个个独立的策略类,然后根据不同的情况选择不同的策略来执行。这样做的好处嘛,当然是让代码更清晰、更易于维护和扩展啦。

js中如何用策略模式替换条件判断

将条件判断替换为策略模式,核心在于定义一系列算法(策略),并将每个算法封装在独立的类中。 客户端可以根据运行时条件选择不同的策略,而无需修改现有代码。

js中如何用策略模式替换条件判断

如何识别应该使用策略模式的场景?

当你发现代码中充斥着大量的条件判断,而且这些判断逻辑还经常变动,那么策略模式可能就是个不错的选择。举个例子,比如你有一个订单处理系统,根据不同的用户类型(普通用户、VIP 用户、超级 VIP 用户)有不同的折扣策略。如果直接用 if...else 来判断,代码会变得很臃肿,而且每增加一种用户类型,都要修改代码。这时候,用策略模式就能很好地解决这个问题。

js中如何用策略模式替换条件判断

策略模式的具体实现步骤

定义策略接口: 声明所有具体策略需要实现的方法。比如,在订单折扣的例子中,可以定义一个 DiscountStrategy 接口,包含一个 calculateDiscount 方法。

// 策略接口class DiscountStrategy {  calculateDiscount(price) {    throw new Error("Method 'calculateDiscount()' must be implemented.");  }}

创建具体策略类: 实现策略接口,每个类代表一种具体的算法。例如,可以创建 NormalUserDiscountVipUserDiscountSuperVipUserDiscount 等类,分别实现不同的折扣计算逻辑。

// 具体策略类 - 普通用户折扣class NormalUserDiscount extends DiscountStrategy {  calculateDiscount(price) {    return price * 0.9; // 九折  }}// 具体策略类 - VIP 用户折扣class VipUserDiscount extends DiscountStrategy {  calculateDiscount(price) {    return price * 0.8; // 八折  }}// 具体策略类 - 超级 VIP 用户折扣class SuperVipUserDiscount extends DiscountStrategy {  calculateDiscount(price) {    return price * 0.7; // 七折  }}

创建环境类(Context): 环境类负责维护一个策略对象,并提供一个方法来执行策略。客户端通过环境类来使用策略,而无需直接与具体策略类交互。

// 环境类class Order {  constructor(userType) {    this.userType = userType;    this.discountStrategy = this.createDiscountStrategy(userType);  }  createDiscountStrategy(userType) {    switch (userType) {      case "normal":        return new NormalUserDiscount();      case "vip":        return new VipUserDiscount();      case "superVip":        return new SuperVipUserDiscount();      default:        return new NormalUserDiscount(); // 默认策略    }  }  calculateFinalPrice(price) {    return this.discountStrategy.calculateDiscount(price);  }}

客户端使用: 客户端只需要创建环境类,并传入相应的参数,就可以使用不同的策略了。

// 客户端使用const normalOrder = new Order("normal");const vipOrder = new Order("vip");const superVipOrder = new Order("superVip");const price = 100;console.log(`普通用户最终价格:${normalOrder.calculateFinalPrice(price)}`); // 输出:普通用户最终价格:90console.log(`VIP 用户最终价格:${vipOrder.calculateFinalPrice(price)}`); // 输出:VIP 用户最终价格:80console.log(`超级 VIP 用户最终价格:${superVipOrder.calculateFinalPrice(price)}`); // 输出:超级 VIP 用户最终价格:70

如何动态切换策略?

上面的例子中,策略是在 Order 类的构造函数中确定的。如果需要在运行时动态切换策略,可以修改 Order 类,提供一个 setDiscountStrategy 方法。

class Order {  constructor(userType) {    this.userType = userType;    this.discountStrategy = this.createDiscountStrategy(userType);  }  createDiscountStrategy(userType) {    switch (userType) {      case "normal":        return new NormalUserDiscount();      case "vip":        return new VipUserDiscount();      case "superVip":        return new SuperVipUserDiscount();      default:        return new NormalUserDiscount(); // 默认策略    }  }  setDiscountStrategy(discountStrategy) {    this.discountStrategy = discountStrategy;  }  calculateFinalPrice(price) {    return this.discountStrategy.calculateDiscount(price);  }}// 客户端动态切换策略const order = new Order("normal");console.log(`初始价格:${order.calculateFinalPrice(100)}`); // 输出:初始价格:90order.setDiscountStrategy(new VipUserDiscount());console.log(`切换为 VIP 折扣后的价格:${order.calculateFinalPrice(100)}`); // 输出:切换为 VIP 折扣后的价格:80

策略模式的优缺点是什么?

优点:代码清晰: 将不同的算法封装在独立的类中,避免了大量的条件判断语句。易于维护: 修改或增加新的策略,不会影响其他策略。易于扩展: 可以很容易地增加新的策略类,而无需修改现有代码。符合开闭原则: 对修改关闭,对扩展开放。缺点:类增多: 每个策略都需要一个类,可能会导致类的数量增多。客户端需要了解所有策略: 客户端需要知道有哪些策略,才能选择合适的策略。

除了订单折扣,策略模式还有哪些应用场景?

策略模式的应用场景非常广泛,比如:

支付方式选择: 可以将不同的支付方式(支付宝微信支付、银行卡支付)封装成不同的策略类。排序算法选择: 可以将不同的排序算法(冒泡排序、快速排序、归并排序)封装成不同的策略类。数据验证: 可以将不同的数据验证规则封装成不同的策略类。

总而言之,策略模式是一种非常有用的设计模式,可以帮助我们编写更清晰、更易于维护和扩展的代码。当然,任何设计模式都不是银弹,需要根据具体的场景来选择是否使用。

以上就是js中如何用策略模式替换条件判断的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1506476.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
js如何生成散点图 使用D3.js绘制数据散点图
上一篇 2025年12月20日 04:10:07
js如何解析CSV格式数据 处理CSV文件的4种解析技巧!
下一篇 2025年12月20日 04:10:24

相关推荐

  • 中国联通正式获得开展 eSIM 手机运营服务商用试验的批复

    感谢网友 会弹琴的九号、学士 的线索投递! 10月13日,三大运营商官方微信号相继发布消息,宣告eSIM服务进入新阶段。其中,中国联通于当日上午10:00率先发布推文《抢约!联通eSIM来了!》,动作迅速,展现出强烈的市场积极性;中国移动在傍晚19:29发布《中国移动全面上线eSIM手机办理》;而中…

    2026年9月22日
    200
  • 如何在抖音上打造个人IP并吸引精准粉丝实现流量变现?

    如何在抖音上打造个人IP并吸引精准粉丝实现流量变现?如何在抖音上打造个人IP并吸引精准粉丝实现流量变现?如何在抖音上打造个人IP并吸引精准粉丝实现流量变现?如何在抖音上打造个人IP并吸引精准粉丝实现流量变现?

    做抖音个人ip需内容定位清晰并持续输出价值。一、找准ip定位:专注细分领域如美妆测评或职场干货,分析同类账号优势,固定内容风格;二、制作“有用”或“有趣”的内容:前3秒抓人眼球,15~60秒提供实用技巧或情绪共鸣,设备简单但开头直接、字幕配音清晰;三、重视精准互动而非粉丝数:引导评论、发起话题、回复…

    2026年9月22日 用户投稿
    000
  • vivoS系列手机微信收款语音播报怎么设置?配置语音的详细方法

    开启微信收款语音播报需在微信“收付款”中启用“收款语音提醒”并授权麦克风权限;2. vivo手机需在设置中开启微信的自启动、后台运行、通知及麦克风权限以确保功能正常;3. 语音播报延迟或无声可能由网络、手机性能、微信版本、系统模式或第三方软件干扰导致;4. 除微信自带功能外,还可选用第三方收款App…

    2026年9月22日
    600
  • 微信注销无法通过验证怎么解决_微信注销验证失败处理方法

    验证失败需先核对实名信息,确保姓名身份证一致,并通过钱包功能检查或更正;随后切换稳定网络并清除微信缓存重试;若仍无法通过,使用原注册设备登录并尝试注销;同时解除所有第三方授权应用;最后联系微信客服提交身份证明材料等待审核处理。 如果您在尝试注销微信账号时遇到验证失败的问题,可能是由于身份信息不匹配、…

    2026年9月22日
    100
  • 抖音小店网页版怎么登录?抖音我的小店在哪里

    随着抖音电商平台的快速发展,越来越多的商家选择入驻该平台。作为商家运营的重要工具之一,抖音小店网页版为店铺管理带来了诸多便利。那么,如何正确登录抖音小店网页版?又该如何找到“我的小店”?下面将为您详细介绍。 一、为什么需要登录抖音小店网页版? 通过抖音小店网页版,商家可以高效地进行商品管理、订单处理…

    2026年9月22日
    000
  • Android自定义开关UI实现教程

    本文详细介绍了在Android应用中实现自定义开关UI的两种主要方法:一是通过集成第三方库如StickySwitch,快速实现美观且功能丰富的开关;二是通过结合Drawable XML和ToggleButton,实现高度定制化的开关外观。文章提供了详细的代码示例和配置说明,旨在帮助开发者灵活地创建符…

    2026年9月22日
    000
  • 为什么不应该在多个网站重复使用同一个密码,撞库攻击的原理是什么?

    撞库攻击利用用户重复使用密码的习惯,黑客通过泄露的账号密码批量尝试登录其他网站,一旦某个小网站密码泄露,相同密码的高价值账户也可能被攻破,因此每个网站应使用独立复杂密码并开启双重验证以提升安全。 不建议在多个网站用同一个密码,核心原因就是防范“撞库攻击”。这种攻击利用了用户重复使用密码的习惯,让黑客…

    2026年9月22日
    700
  • iPhone情侣模式如何设置情侣专属密码?保护隐私的设置技巧

    iPhone情侣模式通过共享日历、照片、位置等功能增进亲密关系,同时利用屏幕使用时间密码、App锁等保护隐私;核心是坦诚沟通,明确共享与隐私边界,避免变为监视模式;结束时应妥善取消共享并尊重对方感受。 iPhone情侣模式,其实就是通过一些设置,让情侣之间既能共享一些信息,又能保护各自的隐私。核心在…

    2026年9月22日
    400
  • 抖音粉丝多少可以开橱窗?抖音带货橱窗怎么开通

    随着抖音短视频平台的快速发展,越来越多用户加入其中。在抖音生态中,粉丝数量是衡量账号影响力的重要标准之一。许多创作者希望通过开启橱窗功能实现盈利。那么,抖音粉丝达到多少才能开通橱窗呢?本文将为您解析开通橱窗的关键门槛。 一、抖音橱窗功能概述 抖音橱窗功能指的是创作者在平台上开设的线上展示窗口,通过该…

    2026年9月22日
    300
  • Linux进程调度学习!

    进程调度决定了哪个进程将被执行以及执行的时间,操作系统通过合理的进程调度实现资源的最大化利用。 在单片机上,常见的方式是系统初始化后进入 while(1){} 循环。当然,单片机也可以运行类似 FreeRTOS 的系统,从而实现进程切换。 在带有操作系统的 CPU 上运行的逻辑是允许多个进程(实际上…

    2026年9月22日
    000
  • 工信部批复:eSIM 手机业务全网开通,暂不支持线上方式

    10 月 14 日消息,据 c114 通讯网报道,中国电信、中国联通与中国移动已于今日正式获得批准,可开展 esim 手机运营服务的商用试验。 根据三大运营商公布的相关信息,eSIM 手机服务将覆盖全国 31 个省、自治区及直辖市,并正式进入市场销售阶段。 需要注意的是,在此次商用试验阶段,暂不支持…

    2026年9月22日
    000
  • 怎样在iPhone情侣模式中管理消息通知?自定义提示音的技巧

    怎样在iPhone情侣模式中管理消息通知?自定义提示音的技巧怎样在iPhone情侣模式中管理消息通知?自定义提示音的技巧怎样在iPhone情侣模式中管理消息通知?自定义提示音的技巧怎样在iPhone情侣模式中管理消息通知?自定义提示音的技巧

    答案:通过自定义提示音、专注模式和沟通策略管理情侣间消息通知。首先为情侣设置专属短信铃声,利用GarageBand制作个性化音效;其次在微信中为特定联系人开启消息免打扰或独立提示音;再通过iOS“专注模式”创建“情侣模式”,仅允许其通知,并设定自动启用时段;若遇不重要通知,可长按关闭或暂时静音联系人…

    2026年9月22日 用户投稿
    000
  • 《零红蝶》重制版与原版对比截图 画面进化但有和谐

    《零红蝶》重制版与原版对比截图 画面进化但有和谐《零红蝶》重制版与原版对比截图 画面进化但有和谐《零红蝶》重制版与原版对比截图 画面进化但有和谐《零红蝶》重制版与原版对比截图 画面进化但有和谐

    之前光荣特库摩公开了恐怖游戏《零红蝶:重制版》,本作计划于2026年初发售,登陆ps5、xsx/s、steam以及switch2平台,并支持中文语言。近日,有网友晒出对比截图,将原版、wii版与即将推出的重制版进行了画面对比。 从图片可以看出,相较于原版和Wii版本,重制版在视觉表现上实现了巨大飞跃…

    2026年9月22日 用户投稿
    300
  • VSCode设置Markdown写作环境(实用技巧,排版美化指南)

    要在vscode里打造舒服又高效的markdown写作环境,答案是通过安装核心扩展并进行个性化配置来实现;需安装markdown all in one、markdown preview enhanced、prettier和paste image等扩展,结合settings.json中的编辑器设置、自…

    2026年9月22日
    200
  • 好用的终端复用神器-Tmux

    好用的终端复用神器-Tmux好用的终端复用神器-Tmux好用的终端复用神器-Tmux好用的终端复用神器-Tmux

    前言 许久之前就听说过tmux,但是一直没上手,直到最近需要一直在linux下完成一些任务,我才切实感受到了tmux的优点:任意分屏、保存工作 就单单这两点,就足够实用了。分屏,曾今还十分痴迷i3wm和dwm这样的窗口管理工具,尤其是dwm的操作逻辑,大大提升linux工作效率。其他详情可以查看阮一…

    2026年9月22日 用户投稿
    200
  • 微信怎么清理不常联系的好友 微信好友管理与批量清理技巧

    可通过查看聊天记录、使用标签分类、借助第三方工具及批量删除等方式清理微信中长期未互动的好友,优化好友列表。 如果您发现微信好友列表中存在大量长期未互动的联系人,导致聊天界面杂乱或查找不便,可以通过以下方法识别并清理不常联系的好友。这些操作有助于优化好友结构,提升沟通效率。 本文运行环境:iPhone…

    2026年9月22日
    100
  • 天猫超市买的东西是一个包裹吗?天猫超市买的东西是一个包裹吗怎么查

    同一订单通常合并发货,但可能分开发货。通过天猫App“我的订单”查看物流信息,若显示一个快递单号则为一个包裹,多个单号则为分开发货;也可通过支付宝账单查询物流详情,或使用第三方物流平台如17TRACK输入单号查询轨迹,单号与包裹数量对应,以此判断发货情况。 如果您在天猫超市下单后,不确定商品是否会被…

    2026年9月22日
    300
  • 抖音飞鸽客服名称怎么改?抖店客服名称怎么改

    电商行业在我国经济中的地位日益凸显。为了满足消费者日益增长的服务需求,各大电商平台纷纷推出特色客服服务。抖音飞鸽客服作为抖音平台的官方客服,以其独特的服务模式和创新精神,赢得了广大用户的认可和好评。本文将从抖音飞鸽客服的名称改写、服务特色、行业影响等方面进行分析,以期为电商客服行业的发展提供借鉴。 …

    2026年9月22日
    100
  • Swift 3到5.1新特性整理

    tocSwift 5.1Swift 5.0Result类型Raw string自定义字符串插值动态可调用类型处理未来的枚举值从try?抹平嵌套可选检查整数是否为偶数字典compactMapValues()方法撤回的功能: 带条件的计数Swift 4.2CaseIterable协议警告和错误指令动态查…

    2026年9月22日
    100
  • php-gd怎么制作缩略图_php-gd生成高质量缩略图

    使用PHP-GD生成高质量缩略图需保持宽高比、选用imagecopyresampled进行重采样,并合理设置JPEG质量(80-95),同时处理PNG透明通道,避免图像失真或背景变黑。 使用 PHP-GD 制作高质量缩略图,核心在于正确处理图像缩放、保持宽高比、避免失真,并选择合适的图像质量参数。下…

    2026年9月22日
    000

发表回复

登录后才能评论
关注微信