# 策略模式

  1. 定义:用在有多种状态或者策略需要进行选择的时候,将所有选择封装在一起,只给外部暴露出必要的接口。
  2. 例子
// 通过闭包生成内部的私有变量,私有变量里面存在着所有策略,所有策略之后返回一个外部接口,外部接口可以增加策略,根据策略进行进行表单验证。
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