位置: 编程技术 - 正文

学习JavaScript设计模式(策略模式)(javascript程序设计教程)

编辑:rootadmin

推荐整理分享学习JavaScript设计模式(策略模式)(javascript程序设计教程),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:javascript简明教程,javascript教程 csdn,javascript设计,javascript设计,javascript教程chm,javascript设计,javascript教程 csdn,javascript课设,内容如对您有帮助,希望把文章链接给更多的朋友!

何为策略?比如我们要去某个地方旅游,可以根据具体的实际情况来选择出行的线路。1、策略模式的定义

如果没有时间但是不在乎钱,可以选择坐飞机。如果没有钱,可以选择坐大巴或者火车。如果再穷一点,可以选择骑自行车。在程序设计中,我们也常常遇到类似的情况,要实现某一个功能有多种方案可以选择。比如一个压缩文件的程序,既可以选择zip算法,也可以选择gzip算法。

定义:策略模式定义一系列的算法,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算饭的客户.

策略模式有着广泛的应用。本节我们就以年终奖的计算为例进行介绍。

2、年终奖实例

很多公司的年终奖是根据员工的工资基数和年底绩效情况来发放的。例如,绩效为S的人年终奖有4倍工资,绩效为A的人年终奖有3倍工资,而绩效为B的人年终奖是2倍工资。假设财务部要求我们提供一段代码,来方便他们计算员工的年终奖。

1). 最初的代码实现

我们可以编写一个名为calculateBonus的函数来计算每个人的奖金数额。很显然,calculateBonus函数要正确工作,就需要接收两个参数:员工的工资数额和他的绩效考核等级。代码如下:

可以发现,这段代码十分简单,但是存在着显而易见的缺点。

calculateBonus函数比较庞大,包含了很多if-else语句,这些语句需要覆盖所有的逻辑分支。

calculateBonus函数缺乏弹性,如果增加了一种新的绩效等级C,或者想把绩效S的奖金系数改为5,那我们必须深入calculateBonus函数的内部实现,这是违反开放-封闭原则的。

算法的复用性差,如果在程序的其他地方需要重用这些计算奖金的算法呢?我们的选择只有复制和粘贴。因此,我们需要重构这段代码。

2). 使用组合函数重构代码

一般最容易想到的办法就是使用组合函数来重构它,我们把各种算法封装到一个个的小函数里面,这些小函数有着良好的命名,可以一目了然地知道它对应着哪种算法,它们也可以被复用在程序的其他地方。代码如下:

目前,我们的程序得到了一定的改善,但这种改善非常有限,我们依然没有解决最重要的问题:calculateBonus函数有可能越来越庞大,而且在系统变化的时候缺乏弹性。

3). 使用策略模式重构代码

经过思考,我们想到了更好的办法——使用策略模式来重构代码。策略模式指的是定义一系列的算法,把它们一个个封装起来。将不变的部分和变化的部分隔开是每个设计模式的主题,策略模式也不例外,策略模式的目的就是将算法的使用与算法的实现分离开来。

在这个例子里,算法的使用方式是不变的,都是根据某个算法取得计算后的奖金数额。而算法的实现是各异和变化的,每种绩效对应着不同的计算规则。

一个基于策略模式的程序至少由两部分组成。第一个部分是一组策略类,策略类封装了具体的算法,并负责具体的计算过程。 第二个部分是环境类Context,Context接受客户的请求,随后把请求委托给某一个策略类。要做到这点,说明Context中要维持对某个策略对象的引用。

学习JavaScript设计模式(策略模式)(javascript程序设计教程)

现在用策略模式来重构上面的代码。第一个版本是模仿传统面向对象语言中的实现。我们先把每种绩效的计算规则都封装在对应的策略类里面:

接下来定义奖金类Bonus:

在完成最终的代码之前,我们再来回顾一下策略模式的思想:

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

这句话如果说得更详细一点,就是:定义一系列的算法,把它们各自封装成策略类,算法被封装在策略类内部的方法里。在客户对Context发起请求的时候,Context总是把请求委托给这些策略对象中间的某一个进行计算。

“并且使它们可以相互替换”,这句话在很大程度上是相对于静态类型语言而言的。因为静态类型语言中有类型检查机制,所以各个策略类需要实现同样的接口。当它们的真正类型被隐藏在接口后面时,它们才能被相互替换。而在JavaScript这种“类型模糊”的语言中没有这种困扰,任何对象都可以被替换使用。因此,JavaScript中的“可以相互替换使用”表现为它们具有相同的目标和意图。

现在我们来完成这个例子中剩下的代码。先创建一个bonus对象,并且给bonus对象设置一些原始的数据,比如员工的原始工资数额。接下来把某个计算奖金的策略对象也传入bonus对象内部保存起来。当调用bonus.getBonus()来计算奖金的时候,bonus对象本身并没有能力进行计算,而是把请求委托给了之前保存好的策略对象:

刚刚我们用策略模式重构了这段计算年终奖的代码,可以看到通过策略模式重构之后,代码变得更加清晰,各个类的职责更加鲜明。但这段代码是基于传统面向对象语言的模仿,下一节我们将了解用JavaScript实现的策略模式。

在5.1节中,我们让strategy对象从各个策略类中创建而来,这是模拟一些传统面向对象语言的实现。实际上在JavaScript语言中,函数也是对象,所以更简单和直接的做法是把strategy直接定义为函数:

同样,Context也没有必要必须用Bonus类来表示,我们依然用calculateBonus 函数充当Context来接受用户的请求。经过改造,代码的结构变得更加简洁:

3、实例再讲解

一个小例子就能让我们一目了然。 回忆下jquery里的animate方法.

这2句代码都是让div在ms内往右移动个像素. linear(匀速)和cubic(三次方缓动)就是一种策略模式的封装.

再来一个例子. 很多页面都会有个即时验证的表单. 表单的每个成员都会有一些不同的验证规则.

比如姓名框里面, 需要验证非空,敏感词,字符过长这几种情况。 当然是可以写3个if else来解决,不过这样写代码的扩展性和维护性可想而知。如果表单里面的元素多一点,需要校验的情况多一点,加起来写上百个if else也不是没有可能。

所以更好的做法是把每种验证规则都用策略模式单独的封装起来。需要哪种验证的时候只需要提供这个策略的名字。就像这样:

可以看到,各种验证规则很容易被修改和相互替换。如果某天产品经理建议字符过长的限制改成个字符。那只需要0.5秒完成这次工作。

大概内容就为大家介绍到这。

聊一聊题外话,马上年要过去了,大家的年终奖是不是很丰厚呀!!!

希望大家可以在这一年里有所收获,通过这篇文章也能有所收获,知道什么是策略模式,理解小编精心为大家准备的两个实例。

js检测iframe是否加载完成的方法 本文实例讲述了js检测iframe是否加载完成的方法。分享给大家供大家参考,具体如下:这里是继上一篇《js实现iframe框架取值的方法(兼容IE,firefox,chrome等)

谈谈javascript中使用连等赋值操作带来的问题 前言文章标题这句话原本是在国外某JavaScript规范里看到的,当时并没有引起足够的重视,直到最近一次出现了bug发现JS里的连等赋值操作的特色(坑)。网

javascript给span标签赋值的方法 js给span标签赋值的方法?一般有两种方法:第一种方法:输出htmlbodyonload="s()"spanid="hello"/spanscriptlanguage="javascript"functions(){document.getElementById("hello").innerHTM

标签: javascript程序设计教程

本文链接地址:https://www.jiuchutong.com/biancheng/386295.html 转载请保留说明!

上一篇:深入浅析同源策略和跨域访问(同源策略详解)

下一篇:js检测iframe是否加载完成的方法(js判断iframe是否加载完成)

  • 小规模纳税人增值税可以抵扣吗
  • 工资薪金税前扣除标准是14%吗
  • 偷税漏税逃税是什么意思
  • 企业注销涉及的法律问题
  • 其他收益里的政府补助免税吗
  • 负数发票要给购票人吗
  • 税控盘交服务费
  • 工伤职工应享有的待遇及救济途径
  • 原材料被盗计入什么科目
  • 收到虚开的普票已经入账怎么调账
  • 融资担保公司会计建议有哪些要求
  • 增值税专用发票电子版
  • 在建工程完工结转
  • 法院受理费用
  • 增值税欠缴税会不会影响企业的信用
  • 以前的服务发票当期确认收入怎么做账
  • 工业混合销售行为如何纳税?
  • 营改增后小规模纳税人
  • 个体户开票超了30万
  • 小规模企业差额征收税率
  • 手撕票可以报销么
  • 固定资产分期抵扣怎么申报增值税?
  • 出售已计提减值准备的固定资产
  • 合作方寄来的礼物能不能收?
  • 汇算清缴时所得税费用
  • 我国的社会保险费
  • 财政拨款结余的明细科目
  • 个人劳务费几个点
  • 腾讯手游助手如何退出登录
  • 如何在windows11上安装动态壁纸
  • php如何编程
  • 王者荣耀体验皮肤什么时候结束
  • linux字体不清晰
  • 前期差错更正怎么理解
  • 政府奖励怎么做账
  • php之间传递数据
  • PHP:imagecreatefrompng()的用法_GD库图像处理函数
  • 实收资本本年利润属于什么科目
  • 支付给个人的劳务报酬代扣个税
  • thinkphp框架介绍
  • 页面访问升级出错怎么办
  • 处置资产的账务处理
  • vue路由详解
  • php判断手机浏览记录数据
  • 季初从业人数和季末从业人数怎么填
  • java的范式
  • python复制文件的代码
  • 标准工资表怎么填
  • 微信小程序 滚动 变色
  • 报废车怎么处理最划算
  • 贷款利息收入如何核算
  • 入账价值有
  • 债权投资的账务处理办法
  • 上月计提少了怎么办
  • 包装物范围
  • 低值易耗品怎么做账
  • 跨年材料票可以入账吗
  • 如何制作会计账簿
  • 原始凭证错误的更正方法
  • 自制半成品核算方法
  • innodb_sys_tables
  • win8系统升级win8.1
  • win7连接宽带
  • 微软系统win10
  • RedHat Linux5.5下Oracle 11g安装图解教程
  • win7盘符不见了
  • linux socket 常用函数小结
  • win7升级win10收费吗
  • windows怎么右键
  • quick3.3 UIListview扩展应用
  • opengles和vulkan哪个好
  • 疯狂冰淇淋罗德
  • linux tcp keepalive
  • 教你一行代码
  • 基于flask的开源项目
  • 批处理命令显示内容
  • 打不死的小强励志词句
  • 垃圾填埋税率
  • 成都税务举报官网
  • 浙江电子税务局app
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设