定义

要实现某一功能有多种方案可以选择;可以定义策略把它们一个个封装起来,并且使它们可以相互转换

场景

当场景中存在多个if或多个if-else时可以使用策略模式
像表单元素中内容的校验、登录用户的权限验证

  1. // 策略模式
  2. // 策略
  3. const strategies = {
  4. // 字符串
  5. // 不为空
  6. isEmpty: (value, errorMsg) => {
  7. return value !== '' ? '' : errorMsg
  8. },
  9. // 最小长度限制
  10. limitLength: (value, errorMsg, minLength) => {
  11. return value.length > minLength ? '' : errorMsg
  12. },
  13. // 只能是汉字
  14. isChinese: (value, errorMsg) => {
  15. return /[\u4E00-\u9FA5]/g.test(value) ? '' : errorMsg
  16. },
  17. // 验证手机号
  18. phoneNumber: (value, errorMsg) => {
  19. return /^1[]/g.test(value) ? '' : errorMsg
  20. },
  21. // 验证邮箱
  22. // 验证身份证号码
  23. // 屏蔽关键字
  24. // 数字
  25. // 最小值
  26. gtMin: (value, errorMsg, minVal) => {
  27. return value > minVal ? '' : errorMsg
  28. },
  29. // 最大值
  30. ltMax: (value, errorMsg, maxVal) => {
  31. return value < maxVal ? '' : errorMsg
  32. },
  33. }
  34. // 校验规则
  35. const Validator = function() {
  36. this.cache = []
  37. this.msg = []
  38. // 添加
  39. this.addValidatorEvent = function(value, method, errorMsg, ...args) {
  40. this.cache.push(function () {
  41. return strategies[method](value, errorMsg, ...args)
  42. })
  43. }
  44. // 检查
  45. this.checkData = function() {
  46. this.cache.map((item) => {
  47. this.msg.push(item())
  48. })
  49. return this.msg
  50. }
  51. }
  52. let validator = new Validator()
  53. validator.addValidatorEvent('', 'isEmpty', '该项不能为空')
  54. validator.addValidatorEvent('123', 'isChinese', '只能是汉字')
  55. validator.addValidatorEvent(22, 'gtMin', '最小值为25', 25)
  56. validator.addValidatorEvent(18, 'ltMax', '最大值为20', 20)
  57. validator.addValidatorEvent('faf', 'limitLength', '字符串最小长度为5', 5)
  58. let res = validator.checkData()
  59. console.log(res)

输出

  1. ["该项不能为空", "只能是汉字", "最小值为25", "", "字符串最小长度为5"]

使用者可根据返回该项的值是否为空字符串来给用户输入提示