位置: 编程技术 - 正文

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

  • 三方代付协议有效吗
  • 接受投资专利技术科目
  • 收据上面盖公章还是财务章
  • 出票后定期付款的汇票是什么意思
  • etc扣费与发票不符
  • 厨房酒店用品
  • 小规模纳税人季度超过45万怎么交税
  • 因管理不善的材料盘亏如何做账
  • 应付职工薪酬包括个税吗
  • 注册资本金应该编入政府性基金预算吗
  • 福利费用交个人所得税吗
  • 案例分析房租完税证明怎么入账?
  • 货运发票与运输发票的区别
  • 成本费用怎么做分录
  • 无票收入增值税申报表怎么填小规模纳税人
  • 售后需要品控吗
  • 包装本公司产品的出口包装物是否缴增值税?
  • 采购流程会计分录怎么写
  • 增值税发票跨年了还能用吗
  • mac菜单栏怎么调出来
  • 为员工购买的团员保险
  • linux的ip查看
  • 蝾螈白话怎么读
  • 公司缴纳的契税怎么查询
  • 赠送现金券是否违法
  • 土地增值税清算管理规程
  • 购买财务软件报什么科目
  • 郁金香地图
  • 因质量问题免费赔偿
  • 微信小程序开发一个多少钱
  • 使用sm4js进行加密和国密sm4的总结
  • echarts图大小设置
  • 数据挖掘的四种基本方法
  • php destruct
  • ubuntu端口不能远程访问
  • 中标费用入什么科目
  • 待摊费用和预提费用属于什么账户
  • 净资产怎么增长
  • 金蝶怎么修改制单人
  • react 上下文hooks内容存储到本地
  • 织梦会员功能
  • 企业注销库存怎么处理
  • 科技经费使用
  • 三代手续费支付申请表怎么填
  • 费用性税金包括增值税吗
  • 去年的电费能查到吗
  • asp连接mysql数据库
  • 收到证券公司信息
  • 劳务费发票入账科目
  • 申报企业所得税会计分录怎么写
  • 应收账款逾期什么意思
  • 职工教育经费产生的差异
  • 递延所得税负债大白话解释
  • 公共电话亭设计案例
  • 地下车库的成本和房子哪个高
  • 生产车间的会计科目
  • 银行代扣水电费发票到哪里打
  • 个人挂靠公司承接工程如何做会计处理?
  • 应付账款借方余额在资产负债表中怎么列示
  • 固定资产折旧计入什么费用
  • 折扣 会计
  • 如何给初建单位发邮件
  • 公司建立初期做账
  • 如何设计高效合理的未来课程
  • cvi linux
  • 同一个用户
  • win10预览版好吗
  • ddriver进程
  • 深入理解ffmpeg pdf
  • css中的auto
  • perl @inc
  • jqgrid动态增加列
  • AngularJS + Node.js + MongoDB开发的基于高德地图位置的通讯录
  • jquery显示图片
  • javascript的简介
  • 使用jQuery Ajax 请求webservice来实现更简练的Ajax
  • android数据存储与访问方式
  • 为什么医保卡显示无效
  • 动漫企业的增值税率
  • 上海42年工龄退休有没有补充养老金呢
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设