在处理未知事情之前,我们可以会有多种假设,并生成不同的方案,针对事情不同的情境我们采用对的方案,这就是策略模式
- 定义
定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。
- 核心
将算法的使用和算法的实现分离开来。
一个基于策略模式的程序至少由两部分组成:
第一个部分是一组策略类,策略类封装了具体的算法,并负责具体的计算过程。
第二个部分是环境类Context,Context接受客户的请求,随后把请求委托给某一个策略类。要做到这点,说明Context 中要维持对某个策略对象的引用
- 实现
策略模式可以用于组合一系列算法,也可用于组合一系列业务规则
在组合业务规则方面,比较经典的是表单的验证方法。这里列出比较关键的部分
// 错误提示
var errorMsgs = {
default: "输入数据格式不正确",
minLength: "输入数据长度不足",
isNumber: "请输入数字",
require: "内容不为空"
}
// 校验器
function Validator() {
// 规则集合
this.rules = {
minLength: function (v1, v2, errorMsg) {
if (v1.length < v2) {
return errorMsg || errorMsgs['minLength']
}
},
isNumber: function (v1, v2, errorMsg) {
if (!/\d+/.test(v1) && v2 == true) {
return errorMsg || errorMsgs['isNumber'];
}
},
required: function (v1, v2, errorMsg) {
if (v1 === '' && v2 === true) {
return errorMsg || errorMsgs['required'];
}
}
}
};
// 原型重定向
Validator.prototype = {
constructor: Validator,
// 添加校验规则
test: function (value, rules) {
for (const rule of rules) {
if (rule.isNumber !== undefined) {
let res = this.rules["isNumber"](value, rule.isNumber, rule.message)
if (res) {
return res
}
}
if (rule.required !== undefined) {
let res = this.rules["required"](value, rule.required, rule.message)
if (res) {
return res
}
}
if (rule.minLength) {
let res = this.rules["minLength"](value, rule.minLength, rule.message)
if (res) {
return res
}
}
}
},
};
var validate = new Validator();
console.log(validate.test('ccc', [{
isNumber: true,
message: "只能为数字"
}]));
console.log(validate.test('12', [{
required: true,
message: "不能为空"
}, {
minLength: 5,
message: "最少5位"
}]));
console.log(validate.test('123', [{
minLength: 5
}]));
console.log(validate.test('12345', [{
minLength: 5
}]));