JavaScript设计模式与开发实践[试读]
1.1 动态类型语言和鸭子类型
JavaScript没有提供传统面向对象语言中的类式继承,而是通过原型委托的方式来实现对象与对象之间的继承。JavaScript也没有在语言层面提供对抽象类和接口的支持。正因为存在这些跟传统面向对象语言不一致的地方,我们在用设计模式编写代码的时候,更要跟传统面向对象语言加以区别。所以在正式学习设计模式之前,我们有必要先了解一些JavaScript在面向对象方面的知识。 1.1 动态类型语言和鸭子类型 编程语言按照数据类型大体可以分为两类,一类是静态类型语言,另一类是动态类型语言。 静态类型语言在编译时便已确定变量的类型,而动态类型语言的变量类型要到程序运行的时候,待变量被赋予某个值之后,... 查看全部[ 1.1 动态类型语言和鸭子类型 ]
1.2 多态
“多态”一词源于希腊文polymorphism,拆开来看是poly(复数)+ morph(形态)+ ism,从字面上我们可以理解为复数形态。 多态的实际含义是:同一操作作用于不同的对象上面,可以产生不同的解释和不同的执行结果。换句话说,给不同的对象发送同一个消息的时候,这些对象会根据这个消息分别给出不同的反馈。 从字面上来理解多态不太容易,下面我们来举例说明一下。 主人家里养了两只动物,分别是一只鸭和一只鸡,当主人向它们发出“叫”的命令时,鸭会“嘎嘎嘎”地叫,而鸡会“咯咯咯”地叫。这两只动物都会以自己的方式来发出叫声。它们同样“都是动物,并且可以发出叫声”,但根据主人的指令,它们会各自发... 查看全部[ 1.2 多态 ]
1.3 封装
封装的目的是将信息隐藏。一般而言,我们讨论的封装是封装数据和封装实现。这一节将讨论更广义的封装,不仅包括封装数据和封装实现,还包括封装类型和封装变化。 1.3.1 封装数据 在许多语言的对象系统中,封装数据是由语法解析来实现的,这些语言也许提供了private、public、protected等关键字来提供不同的访问权限。 但JavaScript并没有提供对这些关键字的支持,我们只能依赖变量的作用域来实现封装特性,而且只能模拟出public和private这两种封装性。 除了ECMAScript 6中提供的let之外,一般我们通过函数来创建作用域: var myObject = (f... 查看全部[ 1.3 封装 ]
1.4 原型模式和基于原型继承的JavaScript对象系统
在Brendan Eich为JavaScript设计面向对象系统时,借鉴了Self和Smalltalk这两门基于原型的语言。之所以选择基于原型的面向对象系统,并不是因为时间匆忙,它设计起来相对简单,而是因为从一开始Brendan Eich就没有打算在JavaScript中加入类的概念。 在以类为中心的面向对象编程语言中,类和对象的关系可以想象成铸模和铸件的关系,对象总是从类中创建而来。而在原型编程的思想中,类并不是必需的,对象未必需要从类中创建而来,一个对象是通过克隆另外一个对象所得到的。就像电影《第六日》一样,通过克隆可以创造另外一个一模一样的人,而且本体和克隆体看不出任何区别。 原型... 查看全部[ 1.4 原型模式和基于原型继承的JavaScript对象系统 ]
5.1 使用策略模式计算奖金
俗话说,条条大路通罗马。在美剧《越狱》中,主角Michael Scofield就设计了两条越狱的道路。这两条道路都可以到达靠近监狱外墙的医务室。 同样,在现实中,很多时候也有多种途径到达同一个目的地。比如我们要去某个地方旅游,可以根据具体的实际情况来选择出行的线路。 如果没有时间但是不在乎钱,可以选择坐飞机。 如果没有钱,可以选择坐大巴或者火车。 如果再穷一点,可以选择骑自行车。 在程序设计中,我们也常常遇到类似的情况,要实现某一个功能有多种方案可以选择。比如一个压缩文件的程序,既可以选择zip算法,也可以选择gzip算法。 这些算法灵活多样,而且可以随意互相替... 查看全部[ 5.1 使用策略模式计算奖金 ]
5.2 JavaScript版本的策略模式
在5.1节中,我们让strategy对象从各个策略类中创建而来,这是模拟一些传统面向对象语言的实现。实际上在JavaScript语言中,函数也是对象,所以更简单和直接的做法是把strategy直接定义为函数: var strategies = { "S": function( salary ){ return salary * 4; }, "A": function( salary ){ return salary * 3; }, "B": fun... 查看全部[ 5.2 JavaScript版本的策略模式 ]
5.3 多态在策略模式中的体现
通过使用策略模式重构代码,我们消除了原程序中大片的条件分支语句。所有跟计算奖金有关的逻辑不再放在Context中,而是分布在各个策略对象中。Context并没有计算奖金的能力,而是把这个职责委托给了某个策略对象。每个策略对象负责的算法已被各自封装在对象内部。当我们对这些策略对象发出“计算奖金”的请求时,它们会返回各自不同的计算结果,这正是对象多态性的体现,也是“它们可以相互替换”的目的。替换Context中当前保存的策略对象,便能执行不同的算法来得到我们想要的结果。... 查看全部[ 5.3 多态在策略模式中的体现 ]
5.4 使用策略模式实现缓动动画
如果让一些不太了解前端开发的程序员来投票,选出他们眼中JavaScript语言在Web开发中的两大用途,我想结果很有可能是这样的: 编写一些让div飞来飞去的动画 验证表单 虽然这只是一句玩笑话,但从中可以看到动画在Web前端开发中的地位。一些别出心裁的动画效果可以让网站增色不少。 有一段时间网页游戏非常流行,HTML5版本的游戏可以达到不逊于Flash游戏的效果。我曾经编写过HTML5版本的街头霸王游戏,让游戏的主角跳跃或是移动,实际上只是让这个div按照一定的缓动算法进行运动而已。 如果我们明白了怎样让一个小球运动起来,那么离编写一个完整的游戏就不遥远了,剩下的只是一些把... 查看全部[ 5.4 使用策略模式实现缓动动画 ]
5.5 更广义的“算法”
策略模式指的是定义一系列的算法,并且把它们封装起来。本章我们介绍的计算奖金和缓动动画的例子都封装了一些算法。 从定义上看,策略模式就是用来封装算法的。但如果把策略模式仅仅用来封装算法,未免有一点大材小用。在实际开发中,我们通常会把算法的含义扩散开来,使策略模式也可以用来封装一系列的“业务规则”。只要这些业务规则指向的目标一致,并且可以被替换使用,我们就可以用策略模式来封装它们。 GoF在《设计模式》一书中提到了一个利用策略模式来校验用户是否输入了合法数据的例子,但GoF未给出具体的实现。刚好在Web开发中,表单校验是一个非常常见的话题。下面我们就看一个使用策略模式来完成表单校验的例子。... 查看全部[ 5.5 更广义的“算法” ]
5.6 表单校验
在一个Web项目中,注册、登录、修改用户信息等功能的实现都离不开提交表单。 在将用户输入的数据交给后台之前,常常要做一些客户端力所能及的校验工作,比如注册的时候需要校验是否填写了用户名,密码的长度是否符合规定,等等。这样可以避免因为提交不合法数据而带来的不必要网络开销。 假设我们正在编写一个注册的页面,在点击注册按钮之前,有如下几条校验逻辑。 用户名不能为空。 密码长度不能少于6位。 手机号码必须符合格式。 5.6.1 表单校验的第一个版本 现在编写表单校验的第一个版本,可以提前透露的是,目前我们还没有引入策略模式。代码如下: <html> &... 查看全部[ 5.6 表单校验 ]
5.7 策略模式的优缺点
策略模式是一种常用且有效的设计模式,本章提供了计算奖金、缓动动画、表单校验这三个例子来加深大家对策略模式的理解。从这三个例子中,我们可以总结出策略模式的一些优点。 策略模式利用组合、委托和多态等技术和思想,可以有效地避免多重条件选择语句。 策略模式提供了对开放—封闭原则的完美支持,将算法封装在独立的strategy中,使得它们易于切换,易于理解,易于扩展。 策略模式中的算法也可以复用在系统的其他地方,从而避免许多重复的复制粘贴工作。 在策略模式中利用组合和委托来让Context拥有执行算法的能力,这也是继承的一种更轻便的替代方案。 当然,策略模式也有一些缺点,但这些缺... 查看全部[ 5.7 策略模式的优缺点 ]
5.8 一等函数对象与策略模式
本章提供的几个策略模式示例,既有模拟传统面向对象语言的版本,也有针对JavaScript语言的特有实现。在以类为中心的传统面向对象语言中,不同的算法或者行为被封装在各个策略类中,Context将请求委托给这些策略对象,这些策略对象会根据请求返回不同的执行结果,这样便能表现出对象的多态性。 Peter Norvig在他的演讲中曾说过:“在函数作为一等对象的语言中,策略模式是隐形的。strategy就是值为函数的变量。”在JavaScript中,除了使用类来封装算法和行为之外,使用函数当然也是一种选择。这些“算法”可以被封装到函数中并且四处传递,也就是我们常说的“高阶函数”。实际上在JavaSc... 查看全部[ 5.8 一等函数对象与策略模式 ]
5.9 小结
本章我们既提供了接近传统面向对象语言的策略模式实现,也提供了更适合JavaScript语言的策略模式版本。在JavaScript语言的策略模式中,策略类往往被函数所代替,这时策略模式就成为一种“隐形”的模式。尽管这样,从头到尾地了解策略模式,不仅可以让我们对该模式有更加透彻的了解,也可以使我们明白使用函数的好处。... 查看全部[ 5.9 小结 ]
书名: JavaScript设计模式与开发实践
作者: 曾探
出版社: 人民邮电出版社
出版年: 2015-5
页数: 294
定价: 59.00元
装帧: 平装
丛书: 图灵原创
ISBN: 9787115388889