关于javascript:轻松搞定策略模式

39次阅读

共计 1699 个字符,预计需要花费 5 分钟才能阅读完成。

定义

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

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

优缺点

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

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

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

示例

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

// part 1
var strategies = {S: function(salary) {return salary * 4;},
  A: function(salary) {return salary * 3;},
  B: function(salary) {return salary * 2;},
}

// part 2
var 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);

正文完
 0