JavaScript设计模式-策略模式

本文深入解析策略模式,通过实例展示了如何使用策略模式封装算法,提高代码的灵活性和可维护性。策略模式能够有效避免多重条件选择语句,支持算法的轻松切换与扩展,适用于需要在运行时动态选择算法的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概念

  1. 多种途径到达同一个目的地
  2. 现实中的例子:
  • 如果没有时间但是不在乎钱,可以选择坐飞机。
  • 如果没有钱,可以选择坐大巴或者火车。
  • 如果再穷一点,可以选择骑自行车。
  1. 在程序设计中,我们也常常遇到类似的情况,要实现某一个功能有多种方案可以选择。比如: 一个压缩文件的程序,既可以选择 zip 算法,也可以选择 gzip 算法。 这些算法灵活多样,而且可以随意互相替换。这种解决方案就是策略模式。

例子

一个基于策略模式的程序至少由两部分组成:

  1. 第一个部分是一组策略类,策略类封装了具体的算法,并负责具体的计算过程。
  2. 第二个部分是环境类,接受客户的请求,随后把请求委托给某一个策略类。
// 传统写法
        // 计算工资,performanceLevel评级、salary基本工资
        const getCalculateBonus = function (performanceLevel, salary) {
            if (performanceLevel === 'A') {
                return salary * 4
            }
            if (performanceLevel === 'B') {
                return salary * 3
            }
            if (performanceLevel === 'C') {
                return salary * 2
            }
        }
        getCalculateBonus('A', 20000) // 输出:40000
        getCalculateBonus('B', 6000) // 输出:24000

        //可以发现,这段代码十分简单,但是存在着显而易见的缺点。
        // 1.calculateBonus 函数比较庞大,包含了很多 if-else 语句,这些语句需要覆盖所有的逻辑分支。
        // 2.calculateBonus 函数缺乏弹性,
        // 如果增加了一种新的绩效等级 D,或者想把绩效 A 的奖金系数改为 5,
        // 那我们必须深入 calculateBonus 函数的内部实现,这是违反开放封闭原则的。
        // 3.算法的复用性差,如果在程序的其他地方需要重用这些计算奖金的算法呢?我们的选择只有复制和粘贴。


        // 使用策略模式
        // 策略模式指的是定义一系列的算法,
        // 把它们一个个封装起来。将不变的部分和变化的部分隔开是每个设计模式的主题,
        // 策略模式也不例外,策略模式的目的就是将算法的使用与算法的实现分离开来。

        // 这里是算法的实现,strategies所以策略的集合
        const strategies = {
            'A': function (salary) {
                return salary * 4
            },
            'B': function (salary) {
                return salary * 3
            },
            'C': function (salary) {
                return salary * 2
            }
        }
        // 这里是算法的使用
        const calculateBonus = function (level, salary) {
            return strategies[level](salary)
        }
        console.log(calculateBonus('A', 20000)) // 输出:80000
        console.log(calculateBonus('B', 10000)) // 输出:30000
        // 当我们想要添加新的类型,我们只需要在strategies里新增(修改)就可以了,而不用去改calculateBonus

        // 一个基于策略模式的程序至少由两部分组成。
        // 第一个部分是一组策略类,策略类封装了具体的算法,并负责具体的计算过程。
        // 第二个部分是环境类 Context,Context 接受客户的请求,随后把请求委托给某一个策略类。

策略模式的优点

  1. 策略模式利用组合、委托和多态等技术和思想,可以有效地避免多重条件选择语句。
  2. 策略模式提供了对开放—封闭原则的完美支持,将算法封装在独立的strategy 中,使得它们易于切换,易于理解,易于扩展。
  3. 策略模式中的算法也可以复用在系统的其他地方,从而避免许多重复的复粘贴工作。
    在策略模式中利用组合和委托来让Context拥有执行算法的能力,这也是继承的一种更轻便的替代方案。

策略模式的缺点

  1. 首先,使用策略模式会在程序中增加许多策略类或者策略对象,但实际上这比把它们负责的逻辑堆砌在 Context 中要好。
  2. 其次,要使用策略模式,必须了解所有的strategy,必须了解各个strategy 之间的不同点,这样才能选择一个合适的strategy。比如,我们要选择一种合适的旅游出行路线,必须先了解选择飞机、火车、自行车等方案的细节。此时 strategy 要向客户暴露它的所有实现,这是违反最少 知识原则的。

总结

定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。

github仓库地址:点击 设计模式例子 查看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值