策略模式
适用场景
策略模式: 个人觉得更适用于需求多变, 容易出现更多种可能性, 开发者需要针对这些不同种可能性做不一样的处理.
例如: 现在全局组件中的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) // 手机格式错误