Author | 王平安 |
---|---|
pingan8787@qq.com | |
博 客 | www.pingan8787.com |
微 信 | pingan8787 |
每日文章推荐 | https://github.com/pingan8787/Leo_Reading/issues |
微信公众号 | 前端自习课 |
五、策略模式(Strategy Pattern)
1.概念介绍
策略模式(Strategy Pattern):封装一系列算法,支持我们在运行时,使用相同接口,选择不同算法。它的目的是为了将算法的使用与算法的实现分离开来。
策略模式通常会有两部分组成,一部分是策略类,它负责实现通用的算法,另一部分是环境类,它用户接收客户端请求并委托给策略类。
2.优缺点
2.1优点
- 有效地避免多重条件选择语句;
- 支持开闭原则,将算法独立封装,使得更加便于切换、理解和扩展;
- 更加便于代码复用;
2.2缺点
- 策略类会增多;
- 所有策略类都需要对外暴露;
3.基本案例
我们可以很简单的将策略和算法直接做映射:
1 | let add = { |
然后我们再把每个策略的算法抽出来:
1 | let fun3 = (num) => num + 3; |
4.表单验证案例
我们需要使用策略模式,实现一个处理表单验证的方法,无论表单的具体类型是什么都会调用验证方法。我们需要让验证器能选择最佳的策略来处理任务,并将具体的验证数据委托给适当算法。
我们假设需要验证下面的表单数据的有效性:
1 | let data = { |
这里需要先配置验证器,对表单数据中不同的数据使用不同的算法:
1 | validator.config = { |
并且我们需要将验证的错误信息打印到控制台:
1 | validator.validate(data); |
接下来我们才要实现validator
中具体的验证算法,他们都有一个相同接口validator.types
,提供validate()
方法和instructions
帮助信息:
1 | // 非空值检查 |
最后就是要实现最核心的validator
对象:
1 | let validator = { |
总结这个案例,我们可以看出validator
对象是通用的,需要增强validator
对象的方法只需添加更多的类型检查,后续针对每个新的用例,只需配置验证器和运行validator()
方法就可以。
5.小结
日常开发的时候,还是需要根据实际情况来选择设计模式,而不能为了设计模式而去设计模式。通过上面的学习,我们使用策略模式来避免多重条件判断,并且通过开闭原则来封装方法。我们应该多在开发中,逐渐积累自己的开发工具库,便于以后使用。
参考资料
- 《JavaScript Patterns》
本部分内容到这结束
Author | 王平安 |
---|---|
pingan8787@qq.com | |
博 客 | www.pingan8787.com |
微 信 | pingan8787 |
每日文章推荐 | https://github.com/pingan8787/Leo_Reading/issues |
JS小册 | js.pingan8787.com |
微信公众号 | 前端自习课 |