设计模式的出现好像都是为了解决一个问题----表现和行为分离。
策略模式的定义
封装一系列的方法,在合适的条件下,调用相应的方法。
策略模式的代码表现
假设我们要计算某些指标
var cateIndex = { bank:function(){ return 'bank'; }, market:function(){ return 'market'; }}
在需要的地方只需要调用对应的方法即可,cateIndex.bank()或者 cateIndex.market()
策略模式解决了什么问题
不用策略模式的计算
function getIndex(type){ if(type=='bank'){ return 'bank' }else if(type =='market'){ return 'market' }}
假设我们的类别有很多个,我们需要在函数中不停的增加 if...else 判断;使用策略模式可以将这些动作配置化,尤其是面对复杂场景,更能体现出来相对的优势;
假如上面的bank类中又需要计算 收入 和 支出,则可以将bank类单独作为一个配置提取出来
const bank = { getIncome:function(){ return 'bank-income' }, getOutPut:function(){ return 'back-outPut'; }}
在需要的地方调用bank相应的方法即可。
一个经典的例子---表单校验
- 先创建一个策略类strategies,定义了用户名不为空,密码不少于6位,手机号必须符合格式的三种策略。
- 然后创建一个validataFunc对象,该对象个原型上添加一个add方法用于将相应的策略添加到validataFunc的缓存中。
- 最后,在还是校验的时候遍历缓存中的策略,如果验证通过则执行下一个,否则,就返回相应的错误信息。
var strategies = { isNotEmpty:function(value,errorMsg){ if(value === ''){ return errorMsg } }, minLength:function(value,length,errorMsg){ if(value.length return errorMsg } }, isMobile:function(value,errorMsg){ if(!/(^1[3|5|8][0-9]{9}$)/.test( value )){ return errorMsg } }}var validataFunc = function(){ // 创建一个 validator 对象 var validator = new Validator(); /***************添加一些校验规则****************/ validator.add( registerForm.userName, 'isNonEmpty', '用户名不能为空' ); validator.add( registerForm.password, 'minLength:6', '密码长度不能少于 6 位' ); validator.add( registerForm.phoneNumber, 'isMobile', '手机号码格式不正确' ); var errorMsg = validator.start(); // 获得校验结果 return errorMsg; // 返回校验结果}var Validator = function(){ this.cache = []; };Validator.prototype.add = function( dom, rule, errorMsg ){ var ary = rule.split( ':' ); // 把 strategy 和参数分开 this.cache.push(function(){ // 把校验的步骤用空函数包装起来,并且放入 cache var strategy = ary.shift(); // 用户挑选的 strategy ary.unshift( dom.value ); // 把 input 的 value 添加进参数列表 ary.push( errorMsg ); // 把 errorMsg 添加进参数列表 return strategies[ strategy ].apply( dom, ary ); });};Validator.prototype.start = function(){ for ( var i = 0, validatorFunc; validatorFunc = this.cache[ i++ ]; ){ var msg = validatorFunc(); // 开始校验,并取得校验后的返回信息 if ( msg ){ // 如果有确切的返回值,说明校验没有通过 return msg; } } };
总结
- 策略模式在工作中的应用还是比较频繁的
- 使用时需要先思考需要将那些部分作为策略对象及策略方法
- 能够将部分代码配置化,代码阅读起来更加清晰明了
我是喜妹子小七,每篇文章尽量不超过1000字----欢迎关注,点赞,转发,评论。。。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5CN2MTNjJ2MwMmYhhTOhNmZkZWN3QDZykjM1AjZiNmYm9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)