此文章只是我自己总结下来让自己有一天用到的时候, 翻出来复习的, 接受指点, 但不接受杠, 谁怼我, 我怼谁....
模式的主旨: 将不变的部分和变化的部分隔开 .
定义: 一系列的算法, 把它们一个个封装起来, 并且使它们可以相互替换.
目的: 将算法的使用与算法的实现分离开来.
策略模式种有两个概念, 策略类与环境类:
策略类: 封装类具体的算法, 并负责具体的计算过程;
环境类: 接受客户的请求, 随后把请求委托给某一个策略类.
栗子
直接把官方的计算奖金的栗子搬过来.
需求: 很多公司的年终奖是根据员工的工资基数和年底绩效情况来发放的. 例如, 绩效为 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 拥有执行算法的能力, 这也是继承的一种更轻便的替换方案.
来源: http://www.jianshu.com/p/4c8afb82a08a