天天看点

策略设计模式_设计模式之 策略模式

设计模式的出现好像都是为了解决一个问题----表现和行为分离。

策略模式的定义

封装一系列的方法,在合适的条件下,调用相应的方法。

策略模式的代码表现

假设我们要计算某些指标

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字----欢迎关注,点赞,转发,评论。。。

策略设计模式_设计模式之 策略模式

继续阅读