位置: 编程技术 - 正文

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

  • 进项税额转出的情况
  • 老板让我去分公司怎么拒绝
  • 收到返款计入什么科目
  • 合并报表存货增值如何做账
  • 车船税放在哪个科目核算
  • 个人独资企业有股权吗
  • 行政单位会议纪要范文3篇
  • 债务重组偿债顺序
  • 虚开增值税普通罪量刑标准
  • 可转换可赎回债券
  • 公司车子的保养费怎么算
  • 行政单位拨给下属单位经费会计分录
  • 营改增操作指引
  • 小规模纳税人收入账务处理
  • 活动板房增值税税率
  • 帮你用好小微企业所得税优惠的7个案例
  • 子公司注销投资收益是否纳税合并层面
  • 车辆处置入账价值包括哪些
  • 收到人民政府寄来的ems
  • 个体工商户变更法人
  • 税控设备 抵减
  • 车间日常维修费用计入什么科目
  • 电子商业承兑与银行承兑哪个好
  • 跨月的成本费用如何,调整
  • 小规模纳税人无票收入免税吗
  • cpu性能排行榜天梯图快科技
  • linux进程操作命令
  • err出错
  • sccenter.exe - sccenter是什么进程 有什么用
  • 手机电脑排行
  • wgcore.dll是什么文件夹
  • xwizard.exe是什么
  • php保存数据
  • 优先股转化
  • 工业设备类型分为以下三类
  • 公司的土地
  • 非上市公司股权估值
  • 先收票后收货
  • redis两种持久化方式的优缺点
  • vue怎么嵌入html
  • java前端开发是做什么的
  • 微信公众号开发淘宝客
  • 保险代理人展业成本如何计算
  • 委托加工物资如何做账
  • 房屋维修费属于什么税收分类编码
  • python 脚本编写
  • 母公司为子公司提供担保是利好吗
  • pygame编程
  • 小规模纳税人销售货物税率是多少
  • 小规模企业所得税怎么征收
  • 营改增后的计税方式
  • 发票可以去做原始凭证吗
  • 购销合同印花税计税依据
  • 总分类账与明细分类账平行登记的要点包括
  • 收到海关进口关税怎么办
  • 经营性现金流量三种算法
  • 工程款预缴税
  • 采用公允价值模式计量的投资性房地产不需要计提折旧
  • 哪些费用是不可抵扣的
  • 固定资产发票怎么处理
  • 增值税免税入账
  • 公司入账是什么意思
  • 数据库聚簇索引和非聚簇索引
  • Win10系统如何取消密码
  • mac怎么安装字体到ai
  • windows注册账号
  • 局域网下访问vue点击无反应
  • unity3d怎么用
  • jquery技巧
  • 图片批量压缩到200k以下
  • shell随机
  • python 数据结构 算法
  • js拖拽生成页面
  • 运用python编写程序
  • javascript中array的正确写法
  • js遍历json对象键值
  • 山东省地方税务局印花税核定征收管理办法
  • 税控盘离线开票时间超限是怎么回事
  • 济宁市税务局官网名称
  • 2008土地管理办法
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设