定义:定义一些列的算法,把他们一个个封装起来,并且使他们能够互相替换。一个基于策略模式的程序至多由两局部组成。第一个局部是一组策略类,策略类封装了具体的算法,并负责具体的计算过程。第二局部是环境类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设计模式于开实际》