策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。
将不变的部分和变化的部分隔开是每个设计模式的主题,策略模式也不例外,策略模式的目的就是将算法的使用与算法的实现分离开来。
一个基于策略模式的程序至少由两部分组成。第一个部分是一组策略类,策略类封装了具体的算法,并负责具体的计算过程。第二个部分是环境类Context, Context接受客户的请求,随后把请求委托给某一个策略类。要做到这点,说明Context中要维持对某个策略对象的引用。
例子:
假如今天是双十一,商城有促销,促销方案如下:
1、满100减5
2、满200减15
3、满300减30
4、满400减50
如果我们需要计算一个商品促销后的价格,很可能写出来的代码是这样子的:
1 | function full100(price) { |
但是这样的代码充满了条件分支,显得冗长且不易维护,每添加一个方案就需要添加一个if语句。
我们使用策略模式来重写下这个功能
1 | const priceObj = { |
测试一下:
1 | // 计算折扣 |
在这个例子中可以看出,calcPriceObj对象是策略部分,它负责具体的计算,而getPrice方法是Context,它接受客户的请求,然后把请求委托给calcPriceObj