js设计模式——策略模式

以验证对象属性为例,直接上代码,文字少 了还不让发。多写几个字。。。。

/*   使用示例
  创建实例
  const v = new validator()
  添加验证
  v.add('requrid', '1', '用户名不能为空')
  v.add('minLength', 'aaa2', 4, '最小位数为4位')
  添加自定义验证
  v.add('custom', 'aaa2', (v) => {
    if(v === "aaa2") {
      return {status: false,msg:'密码不是能是aaa2'}
    } else {
      return {status: true}
    }
  })
  开始验证
  Promise.resolve().then(() => {
    v.start()
  }).then(() => {
    console.log('通过验证')
  }).catch(err => {
    console.log(err.message)
  })
*/

const DICT = {
  required: (val, msg) => {
    if(val){
      return {status: true, msg}
    }
    return  {status: false, msg}
  },
  minLength:(val, len, msg) => {
    if(val && val.length < len) {
      return  {status: false, msg}
    }
    return {status: true, msg}
  }
}

export default class validator {
  constructor() {
    this.arr = []
  }
  add(...args){
    const [key, ...ops] = args
    if(DICT[key]) {
      this.arr.push(() => {
        return DICT[key](...ops)
      })
    } else if(key === 'custom') {
      const[value, fun] = ops
      this.arr.push(() => {return fun(value)})
    }
  }
  start(){
    for(let i = 0; i<this.arr.length; i++) {
      const res = this.arr[i]()
      if(!res.status) {
        this.arr = []
        throw new Error(res.msg)
      }
    }
    this.arr = []
    return Promise.resolve()
  }
}


版权声明:本文为qq_22936647原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。