热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaScript设计模式之策略模式(StrategyPattern)的优势及应用

本文介绍了JavaScript设计模式之策略模式(StrategyPattern)的定义和优势,策略模式可以避免代码中的多重判断条件,体现了开放-封闭原则。同时,策略模式的应用可以使系统的算法重复利用,避免复制粘贴。然而,策略模式也会增加策略类的数量,违反最少知识原则,需要了解各种策略类才能更好地应用于业务中。本文还以员工年终奖的计算为例,说明了策略模式的应用场景和实现方式。
761208b98712a5739be656709ecc798f.png
策略模式的定义

定义一系列的算法,把它们一个个封装起来,并且是它们可以相互替换。

策略模式的优势
  • 策略模式可以避免代码中的多重判断条件。
  • 策略模式很好的体现了开放-封闭原则,将一个个算法(解决方案)封装在一个个策略类中。便于切换,理解,扩展。
  • 策略中的各种算法可以重复利用在系统的各个地方,避免复制粘贴。
  • 策略模式在程序中或多或少的增加了策略类。但比堆砌在业务逻辑中要清晰明了。
  • 违反最少知识原则,必须要了解各种策略类,才能更好的在业务中应用。

此文仅记录本人阅读《Javascript设计模式与开发实践》这个本时的感受,感谢作者曾探写出这么好的一本书。如有冒犯,如有错误,请联系本人处理。

简单的业务场景

计算员工年终奖需要根据不同的员工绩效计算不同的奖金。例如,绩效为S的人年终奖有4倍工资。绩效A的人年终奖有3倍工资,绩效B的人有2倍工资。

用代码实现:

dfe4103891ea15a1adb3f686c7797d27.png

其实上面一段代码已经能应付目前的场景。但是,当奖金的评定需要增加一个绩效C,或者改变绩效A的计算方式。此时需要更改上面这个calculateBonus方法的内部结构,如此下去,这个方法内部将变得冗杂。

设计模式中很重要的一点就是将不变和变分离出来。这里变的是怎么算。不变的是根据一个绩效获得一个结果。所以上述代码重写,把各种算法封装在一个个策略类中(传统面向对象的模仿):

369c1c728e9de1f196a50f609ede2b0c.png

Javascript版本的策略模式

在Javascript中可以将一个个策略类写成函数,然后封装在对象中

c3c32b9733269ef18e2bf79b87d6b248.png

更广义的“算法”

策略模式指的是一系列的算法(策略),并且把它们封装起来。计算奖金的列子中就封装了一些算法。其实世纪业务中也可以利用策略模式来封装一些“业务规则”。

表单验证

在Web项目中往往有很多场景需要提交表单。前端在把数据提交到后端之前,需要进行一波表单验证,来减少不必要的网络请求。在表单验证中往往会有多种校验规则,页面中可能会有多个表单要进行验证。此时可以用策略模式来实现一个表单验证:

dd5df7438ca959f40b437f6703fcde8f.png

上面是定义几种验证的策略(方法)

d55e40424351a2bdca7f8f9d37bea27b.png

接下来是使用策略模式的方式

321163af3f6fb19a353d0ce1178895cb.png

总结

  • 在日常开发中一些工具函数可以封装在一起,组成自己的工具库。减少不必要的代码复制粘贴。
  • 感觉敲代码思想更重要啦,这里策略模式体现了开放-封闭原则降低代码的耦合度。这些理念都是我自己在敲代码的路上要慢慢学习和积累的。
  • 敲出来的代码不能只有自己认识。要多注意细节,时刻去想哪些代码可以再多完善。
  • 当然不是所有的东西都要分来分去,一个简单的需求为了设计模式而去设计模式也是不可取的。
下期预告

Javascript设计模式之装饰者模式(Decorator Pattern)

如果大家有好的主题,可以在下方留言,我会准备相关的内容在后续发布


链接文章:

https://segmentfault.com/a/1190000005342925

https://segmentfault.com/a/1190000012438088



推荐阅读
author-avatar
繁華落盡灬熙
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有