定义
策略模式
是一种常见且无效的设计模式。它指的是定义一系列的算法,把它们一个个封装起来,并且使他们可能互相替换。 策略模式
的实质在于将 算法的应用和算法的实现拆散开来 。一个根本的 策略模式
有以下两局部组成:
- 一组策略类,其外部封装了具体的算法,并负责算法的具体实现。
- 环境类
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);