定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。
适用于业务场景中需要判断多种条件,甚至包含复杂条件嵌套的,可以使用策略模式来提升代码的可维护性和可读性。
比如支付,权限校验,各种复杂的判断场景。
/* 策略类 */var levelOBJ = {"A": (money) => {return money * 4;},"B": (money) => {return money * 3;},"C": (money) => {return money * 2;}}/* 环境类 */var calculateBouns = (level, money) => {return levelOBJ[level](money);}calculateBouns('A', 10000) // 40000calculateBouns('B', 20000) // 60000
实现一个表单校验:
<input type='text' name='username'><input type='password' name='passsword'><button>提交</button>
验证规则如下:
const button = document.querySelector('button')const text = document.querySelector('input[type="text"]')const password = document.querySelector('input[type="password"]')button.onclick = () => {if(text.value === '') {console.log('用户名不能为空')return false;}if(password.value.length < 6) {console.log('密码不能少于6位')return false;}}
这是一个很常见的思路
下面,使用策略模式重构表单校验,新增可扩展性的方法,可根据需求场景来自由发挥。
class Validator {constructor() {/*** 验证列表* 验证规则*/this.rules = []this.strategies = {isEmpty: (val, msg) => {if (!val) return msg},minLength: (val, msg) => {if (val.length < 10) {return msg}}}}// 添加验证内容add(val, rule, msg) {this.rules.push(() => {return this.strategies[rule].call(null, val, msg)})}// 新增验证规则addType(val, fn) {this.strategies[val] = fn}// 开始校验,返回校验后的结果star() {for (let i of this.rules) {const result = i()if (result) {return result}}}}const button = document.querySelector('button')const text = document.querySelector('input[type="text"]')const password = document.querySelector('input[type="password"]')button.onclick = () => {const validator = new Validator()// validator.addType('mobile', (val, msg) => {// if (!/(^1[3|5|8][0-9]{9}$)/.test(val)) {// return msg// }// })validator.add(text.value, 'isEmpty', '用户名不能为空')validator.add(password.value, 'minLength', '密码不能少于10位')const result = validator.star()if (result) {alert(result)} else {// ..success}}