位置: 编程技术 - 正文

学习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是否加载完成)

  • 补提以前年度的盈余公积可以在本年任意月份提取吗
  • 工会经费和福利费怎么花
  • 收购农副产品怎么做账
  • 服务费发票的税率是多少
  • 财务软件怎么结转本年利润
  • 出租车手撕票可以换成增值税发票吗
  • 制造费用影响当期损益的科目
  • 融资租入固定资产的入账价值
  • 固定资产残值怎么处理什么时候处理
  • 公司净资产如何查询
  • 预收货款存入银行分录
  • 旧的固定资产销售怎么算税
  • 专利技术转让使用费如何做会计处理?
  • 转让联营企业股权分录
  • 企业所得税弥补亏损怎么算
  • 企业用流动资金怎么做账
  • 销售使用固定资产账务怎么处理
  • 失控进项发票转出 补税做账
  • 工会经费按上年工资总额还是本年
  • 直系亲属之间转账要交税吗
  • 电信网费普通发票税率为什么是0
  • 在windows中,经常有一些菜单选项呈暗灰色
  • 家具厂打磨工工作图片
  • 劳务费意思
  • PHP:get_meta_tags()的用法_url函数
  • PHP:oci_cancel()的用法_Oracle函数
  • 交易性金融资产属于什么科目
  • 金鱼花的养殖方法与注意事项
  • PHP:iconv_strpos()的用法_iconv函数
  • 总包缴税
  • vue+java+mysql
  • 未核定税种是谁的责任
  • 北京猿创源科技有限公司
  • php-xml
  • PHP array_key_exists检查键名或索引是否存在于数组中的实现方法
  • 研发和技术服务税率由6%变为3%
  • php计时函数
  • php下载文件到指定目录
  • 转出多交增值税账务处理
  • 地方教育附加是非税收入吗
  • MySQL 数据库中,用于事务授权控制的关键词是下面哪个?
  • 会计六大类会计科目
  • 小规模企业申报哪些税
  • 补贴收入是否缴纳个税
  • 企业哪些进项税抵扣
  • 其他综合收益和营业外收入的区别
  • 接受捐赠的材料计入什么科目
  • 销售奖金交税由谁承担
  • 捐赠 赞助 区别
  • 企业发行债券的优点有哪些
  • 外籍人员个税汇算清缴流程
  • 电子记账凭证需要划线吗
  • 产品出库检验报告单格式
  • 《新会计准则》
  • 新手入门会计
  • 银行业应收票据分析
  • 简单的辞职报告
  • mysql里的数据库在哪个位置
  • vmware虚拟机怎么卸载不了
  • ccsve是啥
  • win7桌面提示7601
  • eve是什么文件
  • Stacmon.exe - Stacmon是什么进程 有何作用
  • hpzts04.exe是什么进程 有什么作用 hpzts04进程查询
  • win+p怎么用
  • win7更新8007000e
  • tab栏切换案例
  • android四大组件生命周期
  • linux shell条件判断语句
  • android recyclerview 拖拽加阴影
  • vue3.0diff
  • 浅谈jquery中next与siblings的区别
  • $jquery
  • 所得税 营业税计算公式
  • 小规模纳税人开专票需要交税吗
  • 临沭公交车多久一班
  • 土地二次买卖
  • 长春市征收中心
  • 厂房房产税2021年税率
  • 开展志愿服务关爱活动
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设