# 策略模式

# 定义

定义一系列的算法,并且把它们封装起来

# 用途(表单校验)

// 所有校验规则
var strategies = {
  isNotEmpty(value, errMsg) {
    if (!value) {
      return errMsg
    }
  },
  minLength(value, length, errMsg) {
    if (!value || value.length < length) {
      return errMsg
    }
  }
}

function Validator() {
  // 保存校验规则
  this.cache = []
}

Validator.prototype.add = function(val, rule, errMsg) {
  var ary = rule.split(":")
  this.cache.push(function() {
    // ary的长度可能为1,可能为2
    var strategy = ary.shift()
    ary.unshift(val)
    ary.push(errMsg)

    // strategies[strategy] 为对应策略
    return strategies[strategy].apply(null, ary)
  })
}

Validator.prototype.start = function() {
  for(var i = 0, validatorFunction; validatorFunction = this.cache[i]; i++) {
    var msg = validatorFunction()
    if (msg) {
      return msg
    }
  }
}
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