此文章只是我自己总结下来让自己有一天用到的时候,翻出来复习的,接受指点,但不接受杠,谁怼我,我怼谁....
模式的主旨:将不变的部分和变化的部分隔开 。
定义: 一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。
目的:将算法的使用与算法的实现分离开来。
策略模式种有两个概念,策略类与环境类:
策略类: 封装类具体的算法,并负责具体的计算过程;
环境类: 接受客户的请求,随后把请求委托给某一个策略类。
栗子
直接把官方的计算奖金的栗子搬过来。
需求:很多公司的年终奖是根据员工的工资基数和年底绩效情况来发放的。例如,绩效为 S 的人年终奖有 4 倍工资,绩效为 A 的人年终奖有 3 倍工资,而绩效为 B 的人年终奖是 2 倍工资。假设财务部要求我们提供一段代码,来方便他们计算员工的年终奖。
在不了解策略模式之前我们实现的方案很可能如下:
var calculateBonus = function( performanceLevel, salary ){
if ( performanceLevel === 'S' ){
return salary * 4;
}
if ( performanceLevel === 'A' ){
return salary * 3;
}
if ( performanceLevel === 'B' ){
return salary * 2;
}
};
calculateBonus( 'B', 20000 ); // 输出:40000
calculateBonus( 'S', 6000 ); // 输出:24000
但是,今天我们了解类策略模式,用到策略模式之后,我们实现的方案完全可以如下:
var strategies = {
"S": function( salary ){
return salary * 4;
},
"A": function( salary ){
return salary * 3;
},
"B": function( salary ){
return salary * 2;
}
};
var calculateBonus = function( level, salary ){
return strategies[ level ]( salary );
};
console.log( calculateBonus( 'S', 20000 ) ); // 输出:80000
console.log( calculateBonus( 'A', 10000 ) ); // 输出:30000
虽然看着代码行数变多了,但是后者的好处那也是显而易见的,在我看来最直观的优势就是,代码逼格提高了好几个档次。
策略模式的优点:
1. 策略模式利用组合、委托和多态技术和思想,可以有效地避免多重条件选择语句;
2. 策略模式提供了对开放——封闭原则的完美支持,将算法封装在独立的环境中,使得它们易于切换,易于理解,易于扩展;
3. 策略模式中的算法也可以复用在系统的其它地方,从而避免许多重复的复制粘贴工作;
4. 在策略模式中利用组合和委托来让 Context 拥有执行算法的能力,这也是继承的一种更轻便的替换方案。
网友评论