策略模式

1,011 阅读2分钟
原文链接: github.com

策略模式

适用场景

策略模式: 个人觉得更适用于需求多变, 容易出现更多种可能性, 开发者需要针对这些不同种可能性做不一样的处理.

例如: 现在全局组件中的Message组件, 常见的类型如下: success, error, info, warnning. Message组件就是一个策略对象, 不同的类型就是一个个的策略类.

原理解析

策略模式有两部分组成:

第一部分是策略对象(含有一组不同的策略类), 每个策略类封装具体的功能实现, 甚至你可以理解为策略对象是含有API的对象.

第二部分是环境类(上下文): 其实就是真正对外开发的,接受外界参数的传入,然后内部的实现通过把任务分发到具体的策略类来实现.

demo实现

以常见的表单验证为例子:


// 封装不同策略类的策略对象
const strategies = {
  isEmpty (value, msg = '值为空') {
    if (value === '') {
      return msg
    }
    return false
  },
  isMinLength (value, len, msg='值小于最小长度') {
    if (value.toString().length <= len) {
      return msg
    }
    return false
  },
  isTypeOfMobile (value, msg='值不为手机格式') {
    if (!/^(((13[0-9]{1})|(15[0-9]{1})|(18[0-9]{1}))+\d{8})$/.test(value)) {
      return msg
    }
    return false
  }
}
/*
 option: 配置对象
 type: 类型(必填)
 msg: 错误提示信息(可选)
*/
function validator (option) {
  if (!option || !option['type']) {
    console.error('请必须填写options配置对象')
    return
  }
  const type = option.type
  switch (type) {
    case 'isEmpty':
      return strategies.isEmpty(option.value, option.msg)
      break
    case 'isMinLength':
      return strategies.isMinLength(option.value, option.len, option.msg)
      break
    case 'isTypeOfMobile':
      return strategies.isTypeOfMobile(option.value, option.msg)
      break
    default:
      console.error('请填写合法的type')
  }
}

let res = validator({type: 'isEmpty', value: ''})
console.log(res) // 值为空
let res2 = validator({type: 'isMinLength', value: '1245', len: 6, msg: '最小长度不能小于6'})
console.log(res2) // 最小长度不能小于6
let res3 = validator({type: 'isTypeOfMobile', value: '14512689754', msg: '手机格式错误'})
console.log(res3) // 手机格式错误