定义

策略模式 是一种常见且无效的设计模式。它指的是定义一系列的算法,把它们一个个封装起来,并且使他们可能互相替换。策略模式 的实质在于将 算法的应用和算法的实现拆散开来。一个根本的 策略模式 有以下两局部组成:

  1. 一组策略类,其外部封装了具体的算法,并负责算法的具体实现。
  2. 环境类 Context,其承受客户的申请,并将申请委托给某一个策略类。

优缺点

策略模式 有如下几点劣势:

  • 利用 组合委托多态 等技术,无效防止了多重条件抉择语句。
  • 提供了对 凋谢-关闭 准则的完满反对,应用策略分支函数易于了解和扩大。
  • 组合委托 的形式也让 Context 领有了执行算法的根底能力。
  • 复用性比拟高。

策略模式 的毛病并不是很显著,次要体现在利用须要保护更多的策略对象,然而从实质上来说,其长处还是大于毛病的。

示例

Javascript中,函数作为一等公民其自身也是对象,因而咱们用对象来实现 策略模式

// part 1var strategies = {  S: function(salary) {    return salary * 4;  },  A: function(salary) {    return salary * 3;  },  B: function(salary) {    return salary * 2;  },}// part 2var calculateBouns = function(level, salary) {  return strategies[level](salary);};console.log(calculateBouns('S', 2000));console.log(calculateBouns('A', 800));

场景

表单校验

在日常的表单交互中,咱们会遇到各种输出项绑定对应的表单校验规定,如果给每个输出项一一写上对应规定会比拟费时且冗余,此时咱们能够采纳 策略模式 来进行革新。

var strategies = {  isNonEmpty(value, errorMsg) {    if(value === '' || value == null) {      return errorMsg;    }  },  minLength(value, length, errorMsg) {    if(value.length < length) {      return errorMsg;    }  },  isMobile(value, errorMsg) {    if(!/1[3][5][8][0-9]{9}$/.test(value)) {      return errorMsg;    }  },}

在实现了表单的规定映射表之后,再新建一个规定校验的 Validator 类。Validator 类在这里是作为 Context 的作用,负责接管用户的申请并委托给 strategies 以匹配对应的规定。

var Validator = function() {  this.cache = [];}Validator.prototype.add = function(value, rule, errorMsg) {  var arr = rule.split(':');  this.cache.push(    function() {      var stratery = arr.shift();      arr.unshift(value);      arr.push(errorMsg); // [44, "isMobile", '手机号格局不正确']      return strategies[stratery].apply(this, arr)    }  )}Validator.prototype.start = function(value, rule, errorMsg) {  for(let i = 0; i < this.cache.length; i++) {    var validator = this.cache[i];    var msg = validator();    if(msg) {      return msg    }  }}// 应用var validator = new Validator();validator.add('13136199370', 'isMobile', '手机号格局不正确');validator.add('12', 'minLength: 6', '明码长度不能少于6位');var errMsg = validator.start();console.log(errMsg);