javaScript设计模式之策略模式

1.概念介绍
策略模式(Strategy Pattern):封装一系列算法,支持我们在运行时,使用相同接口,选择不同算法。它的目的是为了将算法的使用与算法的实现分离开来。

策略模式通常会有两部分组成,一部分是策略类,它负责实现通用的算法,另一部分是环境类,它用户接收客户端请求并委托给策略类。

2.优缺点
2.1优点

  1. 有效地避免多重条件选择语句;

  2. 支持开闭原则,将算法独立封装,使得更加便于切换、理解和扩展;

  3. 更加便于代码复用;

2.2缺点

  1. 策略类会增多;

  2. 所有策略类都需要对外暴露;

3.基本案例

多重条件判断

if(userName == "") {
    tips('请输入姓名')
    return 
}else if(phone == null) {
    tips('请输入电话号码')
    return
}else if(cardType == "") {
    tips('请输入证件类型')
    return
}else if(cardNum == '') {
    tips('请输入证件号码')
    return
}

像这种多重判断,且每个判断都符合单一原则,我们可以使用策略模式来实现更简单的校验:

let obj = {
    userName: 'lisi',
    phone: "",
    cardType: 'id',
    cardNum: '666'
}

let { userName,phone,cardType,cardNum } = obj

const rules = [
    { valid: userName, err: '请输入姓名' },
    { valid: phone, err: '请输入电话号码' },
    { valid: cardType, err: '请输入证件类型' },
    { valid: cardNum, err: '请输入证件号码' }
]

for(let val of rules) {
    if(!val.valid) {
      throw(val.err)
      break
    }
}

上面的运行结果: 会抛出请输入电话号码的错误,这样就可以让检验的策略与实际逻辑判断分离,减少了if…else的使用.

策略与算法映射

我们可以很简单的将策略和算法直接做映射:

let add = {
    add3: num => num + 3,
    add5: num => num + 5,
    add10: num => num + 10,
}

let demo = (type,num) => add[type](num)
console.log(add['add3'](10)) // 13
console.log(add['add5'](20)) // 25

然后我们再把每个策略的算法抽出来:

let fun3 = num => num + 3
let fun5 = num => num + 5
let fun10 = num => num + 10

let add = {
    add3: fun3,
    add5: fun5,
    add10: fun10,
}

let demo = (type,num) => add[type](num)
console.log(add['add3'](10)) // 13
console.log(add['add5'](20)) // 25

4.表单验证案例

我们需要使用策略模式,实现一个处理表单验证的方法,无论表单的具体类型是什么都会调用验证方法。我们需要让验证器能选择最佳的策略来处理任务,并将具体的验证数据委托给适当算法。

我们假设需要验证下面的表单数据的有效性:

let data = {
    name: 'pingan',
    age: 'unknown',
    nickname: 'leo',
}

这里需要先配置验证器,对表单数据中不同的数据使用不同的算法:

validator.config = {
    name: 'isNonEmpty',
    age: 'isNumber',
    nickname: 'isAlphaNum',
}

并且我们需要将验证的错误信息打印到控制台:

validator.validate(data);

if(validator.hasErrors()){
    console.log(validator.msg.join('\n'));
}

接下来我们才要实现 validator中具体的验证算法,他们都有一个相同接口 validator.types,提供 validate()方法和 instructions帮助信息:
在这里插入图片描述
最后就是要实现最核心的 validator对象:

在这里插入图片描述
总结这个案例,我们可以看出 validator对象是通用的,需要增强 validator对象的方法只需添加更多的类型检查,后续针对每个新的用例,只需配置验证器和运行 validator()方法就可以。

5.小结

日常开发的时候,还是需要根据实际情况来选择设计模式,而不能为了设计模式而去设计模式。通过上面的学习,我们使用策略模式来避免多重条件判断,并且通过开闭原则来封装方法。我们应该多在开发中,逐渐积累自己的开发工具库,便于以后使用。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值