JavaScript设计模式 - 策略模式

1. 策略模式的简单理解

定义:多种途径达到同一个目的地
案例
1. 如果没有时间但是不在乎钱,可以选择坐飞机
2. 如果没有钱,可以选择坐大巴或者火车
3. 如果再穷一点,可以选择骑自行车
实现:定义一系列的算法,把他们封装起来,并且使他们可以相互替换

2. 案例

2.1 使用 if else来实现
const calculateBouns = function(perfomancelevel, salary) {
            if (perfomancelevel === 'S') {
                return salary * 4
            }
            if (perfomancelevel === 'A') {
                return salary * 3
            }
            if (perfomancelevel === 'B') {
                return salary * 2
            }
        }

        calculateBouns('S', 10000)

以上计算方法存在的缺点:

  1. 函数比较庞大,包含了很多if-else语句,这些语句需要覆盖所有的逻辑分支
  2. 函数缺乏弹性,如果增加一种新的绩效等级C,或者想把绩效S的奖金系数改为5,那我们必须深入函数的内部实现,这是违反开放 - 封闭的原则的
  3. 法的复用性查,如果在程序的其他地方需要重用这些计算的方法,只能进行复制粘贴
2.2 使用策略模式实现

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

  1. 策略类:策略类封装了具体的算法,并负责计算过程
  2. 环境类Context, Context接收客户端的请求,随后把请求委托给某一个策略类。

要做到这点,说明Context中要维持对某个策略对象的引用

详细一点:定义一系列的算法,把它们各自封装成策略类,算法被封装在策略类内部的方法里面。在客户对Context发起请求的时候,Context总是吧请求委托给这些策略对象中间的某一个进行计算

const strategy = {
            'S': function(salary) {
                return salary * 4
            },
            'A': function(salary) {
                return salary * 3
            },
            'B': function(salary) {
                return salary * 2
            }
        }

        const getBouns = function(level, salary) {
            return strategy[level](salary)
        }

        console.log(getBouns('S', 1000))

3. 策略模式的优缺点

3.1 优点:
  1. 策略模式利用组合,委托和多态等技术和思想,可以有效地避免多重条件选择语句
  2. 策略模式提供了对开放-封闭原则的完美支持,将算法封装在独立的strategy中,使得他们易于切换,易于理解,易于扩展
  3. 策略模式中的算法也可以复用在系统的其他地方,从而避免许多重复的复制粘贴工作
  4. 在策略模式中利用组合和委托来让context拥有执行算法的能力,这也是继承的一种更轻便的替代方案
3.2 缺点:
  1. 使用策略模式会在程序中增加许多策略类或者策略对象,但实际上这比把他们负责的逻辑堆砌在Context中要好
  2. 要是要策略模式,必须了解所有的strategy,必须了解各个strategy之间的不同点,这样才能选择一个合适的strategy。比如,我们要选择一个合适的旅游出行路线,必须先了解选择飞机,火车,自行车等方案的细节。此时strategy要向客户暴露他的所有实现,这是违反最少知识原则的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值