JS设计模式之策略模式
2017-11-19 22:52
295 查看
策略模式:将定义的一组算法封装起来,使其相互之间可以替换。封装的算法具有一定独立性,不会随客户端变化而变化。策略模式主要是一种用于处理多种分支判断的模式。
我们用最直观的方法来计算奖金,但是这么做有诸多弊端。
1、calculateBonus 函数比较庞大,包含了很多 if-else 语句,这些语句需要覆盖所有的逻辑
分支。
2、calculateBonus 函数缺乏弹性,如果增加了一种新的绩效等级 C,或者想把绩效 S 的奖金
系数改为 5,那我们必须深入 calculateBonus 函数的内部实现,这是违反开放封闭原则的。
3、算法的复用性差,如果在程序的其他地方需要重用这些计算奖金的算法呢?我们的选择
只有复制和粘贴。
使用策略模式重构代码:
代码清晰了很多,也便于维护。
我们还可以用addStrategy添加新的校验规则。
策略模式使得算法脱离于模块逻辑而独立管理,使我们可以专心研发算法,而不必受模块逻辑所约束。
生活中的例子
大家在工作中基本都是有绩效考核的,这个绩效考核关乎奖金的发放。比如说:绩效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
我们用最直观的方法来计算奖金,但是这么做有诸多弊端。
1、calculateBonus 函数比较庞大,包含了很多 if-else 语句,这些语句需要覆盖所有的逻辑
分支。
2、calculateBonus 函数缺乏弹性,如果增加了一种新的绩效等级 C,或者想把绩效 S 的奖金
系数改为 5,那我们必须深入 calculateBonus 函数的内部实现,这是违反开放封闭原则的。
3、算法的复用性差,如果在程序的其他地方需要重用这些计算奖金的算法呢?我们的选择
只有复制和粘贴。
使用策略模式重构代码:
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
代码清晰了很多,也便于维护。
实际应用
表单提交是十分常见的。经常我们需要验证表达的正确性。这个时候我们便可以使用策略模式来一次校验不同表单类型的校验。var formValidator = (function() { var strategy = { //验证是否为空 isNull: function(val) { return /\S+/.test(val) ? '请输入内容' : ''; }, //验证手机号码是否输入正确 phone: function(val) { return !/^1[3|4|5|8][0-9]\d{4,8}$/.test(val) ? '请输入正确的手机号码' : ''; } } return { check: function(type, val) { return strategy[type] ? strategy[type](val) : '没有该类型的检测方法' }, //添加新的策略 addStrategy(type, fn) { strategy[type] = fn; } } })(); var isPhone = formValidator.check('phone', '111111111111') console.log(isPhone)//请输入正确的手机号码
我们还可以用addStrategy添加新的校验规则。
策略模式使得算法脱离于模块逻辑而独立管理,使我们可以专心研发算法,而不必受模块逻辑所约束。
相关文章推荐
- 大熊君说说JS与设计模式之------策略模式Strategy
- JS 设计模式--策略模式
- JS设计模式-策略模式
- JS设计模式之策略模式概念与用法分析
- JS设计模式——策略模式
- JS设计模式-策略模式
- JS常用的设计模式(9)——策略模式
- 策略模式--js设计模式与开发实践-7
- js-设计模式学习笔记-策略模式
- 【JS设计模式】策略模式的代码示例
- 理解js设计模式之策略模式
- JS设计模式之策略模式
- js设计模式--策略模式
- 设计模式之策略模式浅谈
- 设计模式 -- 策略模式 -- c++实现
- Java 设计模式---策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式一之策略模式
- 设计模式——策略模式