策略模式
策略模式的含义是:创建一堆的可替换的策略,使用时直接传递需要的策略即可。这里要注意可替换的概念。
比如我要设计一个 validate函数, 那么我只需要关心,我要去测试谁,要什么策略去测试。
下面是策略模式的使用最多的方式: 先定义一个策略对象,封装各种策略,然后使用的时候,直接使用你想要的哪种策略即可。有点类似多态的思想,validate并不关心具体使用什么策略,只是知道使用这个策略即可,所以其中的许多if else等就巧妙的避免了。具体使用的时候 传递想要的策略进去就行了
var validateStrategy = {
isEmail: /\w(\.\w+)*@\w+\.\w{2,3}/,
isEmpty: /^\s*$/
}
function validate(value, strategyType) {
return validateStrategy[strategyType].test(value);
}
console.log(validate('535@qq.com', 'isEmail'));
console.log(validate('', 'isEmpty'));
为了有报错提示,加入提示信息
var validateStrategy = {
isEmail: function(value, errorMsg) {
if (!/\w(\.\w+)*@\w+\.\w{2,3}/.test(value)) {
return errorMsg;
}
},
isEmpty: function(value, errorMsg) {
if (!/^\s*$/.test(value)) {
return errorMsg;
}
}
}
function validate(value, strategyType, errorMsg) {
return validateStrategy[strategyType](value, errorMsg)
}
console.log(validate('535.@qq.com', 'isEmail', "邮箱出错")); //邮箱出错"
console.log(validate('', 'isEmpty', '不为空')); //underfined
还能进一步么?其实对于函数式编程来说,策略模式是隐含的,我们只需要把函数作为策略参数即可
var isEmail = function(value, errorMsg) {
if (!/\w(\.\w+)*@\w+\.\w{2,3}/.test(value)) {
return errorMsg;
}
}
var isEmpty =function(value, errorMsg) {
if (!/^\s*$/.test(value)) {
return errorMsg;
}
}
function validate(value, strategyFUN, errorMsg) {
return strategyFUN(value, errorMsg)
}
console.log(validate('535.@qq.com', isEmail, "邮箱出错")); //邮箱出错"
console.log(validate('', isEmpty, '不为空')); //underfined