# 策略模式
- 定义:用在有多种状态或者策略需要进行选择的时候,将所有选择封装在一起,只给外部暴露出必要的接口。
- 例子
// 通过闭包生成内部的私有变量,私有变量里面存在着所有策略,所有策略之后返回一个外部接口,外部接口可以增加策略,根据策略进行进行表单验证。
var formStrategy = (function() {
var strategy = {
notEmpty: function(value) {
return value.length ? "" : "请填写内容";
},
isNumber: function(value) {
var reg = /^[0-9]+(\.[0-9]+)?$/;
return reg.test(value) ? "" : "请填写一个数字";
},
isPhone: function(value) {
varreg = /^\d{3}-\d{8}$|^\d{4}-\d{7}$/;
return reg.test(value) ? "" : "请输入一个正确的电话号码";
},
};
return {
validate:function(type,value){
value=value.replace(/^\s+|\s+$/,'');
return strategy[type]?strategy[type](value):'没有检测到方法,请手动添加'
},
addStrategy:function(type,fn){
if(strategy[type]){
return '这个方法已经存在'
}else{
strategy[type]=fn
}
}
}
})();
window.onload=function(){
formStrategy.addStrategy('isEmail',function(value){
var reg=/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/
return reg.test(value)?'':'请输入一个正确的邮箱地址'
})
var oInput=document.querySelector('input')
oInput.onchange=fucntion(){
var result;
result=formStrategy.validate('notEmpty',this.value)||formStrategy.validate('isNumber',this.value)||'通过检测';
console.log(result)
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42