定义:定义一些列的算法,把他们一个个封装起来,并且使他们能够互相替换。一个基于策略模式的程序至多由两局部组成。第一个局部是一组策略类,策略类封装了具体的算法,并负责具体的计算过程。第二局部是环境类 Context,Context 接管客户的申请,随后将申请委托给某一个策略类。要做到这点,阐明 Context 中要维持对某个策略对象的援用。
思考下这个问题:
很多公司的年终奖是依据员工的工资基数和年底绩效状况来发放的。例如,绩效为 S 的人年终奖有 4 倍工资,绩效为 A 的人年终奖有 3 倍的工资,二绩效为 B 的人年终奖有 2 倍工资。假如财务部要求咱们提供一段代码,来不便他们计算员工的年终奖。
1、最后的实现:
咱们能够编写一个名为 calculateBonus 的函数来计算每个人的奖金数额。很显然,calculateBonus 函数要正确工作,就须要接管两个参数:员工的工资数额和他的绩效考核等级。代码如下:
能够发现,这段代码非常简略,然而存在着不言而喻的毛病:
- calculateBonus 函数比拟宏大,蕴含了很多 if-else 语句,这些语句须要笼罩所有的逻辑分支。
- calculateBonus 函数不足弹性,如果减少了一种新的绩效等级 C,或者想把绩效 S 的奖金系数改为 5,那咱们必须深刻 calculateBouns 函数外部实现,这是违反凋谢 - 关闭准则的。
- 算法的复用性差,如果在程序中的其余中央须要重用这些计算奖金的算法呢?咱们的抉择只有复制和粘贴。
2、应用组合函数重构代码
个别最容易想到的方法就是应用组合函数来重构代码,咱们把各种算法封装到一个个小函数里,这些小函数有着良好的命名,能够高深莫测地晓得它对应着哪种算法,它们也能够被复用在程序的其余中央。代码如下:
目前,咱们的程序失去了肯定的改善,但这种改善十分无限,咱们仍然没有解决最终要的问题:calculateBonus 函数有可能越来越大,而且在零碎变动时不足弹性。
3、应用策略模式重构代码
策略模式指的是定义一系列的算法,把它们一个个封装起来。将不变的局部和变动的局部隔开是每个设计模式的主题。策略模式也不例外,策略模式的目标就是将算法的应用和算法的实现拆散开来。
在这个例子中,算法的应用形式是不变的,都是依据某个算法获得计算后的奖金数额。而算法的实现是各异和变动的,每种绩效对应着不同的计算规定。
当初用策略模式重构下面代码,代码如下:
在应用策略模式重构后的代码中咱们能够看到,calculateBonus 办法接管客户的申请,将申请委托给策略对象 strategies。calculateBonus 是不变的,当前如果须要增加一个绩效等级 C 的话,咱们能够不必批改 calculateBonus 中的任何代码,而只须要扩大策略对象 strategies 即可,例如:,这是合乎凋谢 - 关闭准则的。
内容取自:《JavaScript 设计模式于开实际》