图灵社区会员 轩辕 专享 尊重版权 图灵社区会员 轩辕 专享 尊重版权 图灵社区会员 轩辕 专享 尊重版权 图灵社区会员 轩辕 专享 尊重版权 内 容 提 要 本书根据 JavaScript 语言的特性,全面总结了实际工作中常用的设计模式。全书共分为三个部分,第 一部分讲解了 JavaScript 语言面向对象和函数式编程的知识及其在设计模式方面的作用 ;第二部分通过一 步步完善示例代码,由浅入深地讲解了 16 个设计模式 ;第三部分讲述了面向对象的设计原则及其在设计 模式中的体现,以及一些常见的面向对象编程技巧和日常开发中的代码重构。 书中所有示例均来自作者长期的开发实践, 与实际开发密切相关, 适用于初、 中、 高级 Web 前端开 发人员,尤其适合想往架构师晋级的中高级程序员阅读。 ◆ 著 曾 探 责任编辑 王军花 执行编辑 张 霞 责任印制 杨林杰 ◆ 人民邮电出版社出版发行 北京市丰台区成寿寺路11号 邮编 100164 电子邮件 315@ptpress.com.cn 网址 http://www.ptpress.com.cn 北京 印刷 ◆ 开本:800×1000 1/16 印张:19.5 字数:461千字 印数:1 — 4 000册 2015年 5 月第 1 版 2015年 5 月北京第 1 次印刷 定价:59.00元 读者服务热线:(010)51095186转600 印装质量热线:(010)81055316 反盗版热线:(010)81055315 广告经营许可证:京崇工商广字第 0021 号 图灵社区会员 轩辕 专享 尊重版权 前 言 1 序 如果时间倒退一点,很难想象我这样的“懒人”会花上近一年的业余时间来完成这本书。 这本书的原型是我发表在腾讯内部KM论坛的一篇文章《JavaScript常用设计模式》。这篇文 章反响不错,还位列2012年KM十大热门文章第一名。不过说老实话,当时自己也是模式的初学 者,和网上大部分讨论设计模式的文章一样,这篇文章里其实存在一些错误,这里要诚恳地说声 抱歉。也正是由于这个原因,近两年我重新投身于对设计模式的研究之中。尽管如此,当在电脑 上敲下本书第一行字的时候,我心中还是非常忐忑。一是我自己本身并非理论派,大部分工作时 间都在做上层应用开发,很多偏理论的知识对于我来说,也是一个学习加总结的过程,二是不确 保自己能否牺牲如此多的业余时间,毕竟很难削减玩LOL的时间。 无论如何,它终于和大家见面了。 本书结构 本书共分为三大部分。 第一部分讲解了JavaScript面向对象和函数式编程方面的知识,主要包括静态类型语言和动 态类型语言的区别及其在实现设计模式时的异同,以及封装、继承、多态在动态类型语言中的 体现,此外还介绍了JavaScript基于原型继承的面向对象系统的来龙去脉,给学习设计模式做好 铺垫。 第二部分是核心部分,通过从普通到更好的代码示例,由浅到深地讲解了16个设计模式。 第三部分主要讲解面向对象的设计原则及其在设计模式中的体现,还介绍了一些常见的面向 对象编程技巧和日常开发中的代码重构。 目标读者 本书主要面向初中级JavaScript开发人员。本书虽然以设计模式为主题,但也讲述了一些 JavaScript开发中需要的基础知识,初级程序员也能从这里找到自己需要的东西。而对于中级程序 员而言,学习设计模式的过程,可能正是往高级进阶的过程。 图灵社区会员 轩辕 专享 尊重版权 2 序 示例代码与勘误 本书提供了丰富的示例,示例代码可以在图灵社区本书主页(http://www.ituring.com.cn/ book/1632)的“随书下载”中下载使用。 另外,由于作者的水平和时间所限,本书中难免存在一些遗憾。如果大家发现有什么问题,或 者对本书有任何建议,欢迎到图灵社区本书主页提交勘误,也可以发送邮件到svenzeng@tencent.com 来讨论,先谢谢! 致谢 虽然在写作过程中经历了不少曲折,但最终顺利完成。在这里,我想感谢为我提供帮助的所 有人。 感谢图灵的美女编辑Alice,没有她的帮助,这本书不可能完成。 感谢AlloyTeam团队中每一个成员对我的指导和帮助,在这里工作不仅是工作,也是生活很 重要的一部分。 感谢贺师俊、王集鹄、易郑超、程劭非几位老师提供的技术指导和宝贵建议。 感谢设计师“出壳设计”设计的插画和封面,它们让内容更加生动有趣。 最后,感谢我的妻子Annie,遇见你,是最美丽的意外。 图灵社区会员 轩辕 专享 尊重版权 前 前 言 1 言 《设计模式》一书自1995年成书一来,一直是程序员谈论的“高端”话题之一。许多程序员 从设计模式中学到了设计软件的灵感,或者找到了问题的解决方案。在社区中,既有人对模式无 比崇拜,也有人对模式充满误解。有些程序员把设计模式视为圣经,唯模式至上;有些人却认为 设计模式只在C++或者Java中有用武之地,JavaScript这种动态语言根本就没有设计模式一说。 那么,在进入设计模式的学习之前,我们最好还是从模式的起源说起,分别听听这些不同的 声音。 设计模式并非是软件开发的专业术语。实际上, “模式”最早诞生于建筑学。20世纪70年代, 哈佛大学建筑学博士Christopher Alexander和他的研究团队花了约20年的时间,研究了为解决同一 个问题而设计出的不同建筑结构,从中发现了那些高质量设计中的相似性,并且用“模式”来指 代这种相似性。 受Christopher Alexander工作的启发,Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides四人(人称Gang Of Four ,GoF)把这种“模式”观点应用于面向对象的软件设计中, 并且总结了23种常见的软件开发设计模式,录入《设计模式:可复用面向对象软件的基础》一书。 设计模式的定义是:在面向对象软件设计过程中针对特定问题的简洁而优雅的解决 方案。 通俗一点说,设计模式是在某种场合下对某个问题的一种解决方案。如果再通俗一点说,设 计模式就是给面向对象软件开发中的一些好的设计取个名字。 GoF成员之一 John Vlissides在他的另一本关于设计模式的著作《设计模式沉思录》中写过这 样一段话: 设想有一个电子爱好者,虽然他没有经过正规的培训,但是却日积月累地设计并制 造出许多有用的电子设备:业余无线电、盖革计数器、报警器等。有一天这个爱好者决 定重新回到学校去攻读电子学学位,来让自己的才能得到真实的认可。随着课程的展开, 这个爱好者突然发现课程内容都似曾相识。似曾相识的并不是术语或者表述的方式,而 是背后的概念。这个爱好者不断学到一些名称和原理,虽然这些名称和原理原来他不知 道,但事实上他多年来一直都在使用。整个过程只不过是一个接一个的顿悟。 图灵社区会员 轩辕 专享 尊重版权 2 前 言 软件开发中的设计也是如此。这些“好的设计”并不是GoF发明的,而是早已存在于软件开 发中。一个稍有经验的程序员也许在不知不觉中数次使用过这些设计模式。GoF最大的功绩是把 这些“好的设计”从浩瀚的面向对象世界中挑选出来,并且给予它们一个好听又好记的名字。 那么,给模式一个名字有什么意义呢?上述故事中的电子爱好者在未进入学校之前,一点都 不知道这些关于电器的概念有一些特定的名称,但这不妨碍他制造出一些电子设备。 实际上给“模式”取名的意义非常重要。人类可以走到生物链顶端的前两个原因分别是会“使 用名字”和“使用工具”。在软件设计中,一个好的设计方案有了名字之后,才能被更好地传播, 人们才有更多的机会去分享和学习它们。 也许这个小故事可以说明名字对于模式的重要性:假设你是一名足球教练,正在球场边指挥 一场足球赛。通过一段时间的观察后,发现对方的后卫技术精湛,身体强壮,但边后卫速度较慢, 中后卫身高和头球都非常一般。于是你在场边大声指挥队员: “用速度突破对方边后卫之后,往 球门方向踢出高球,中路接应队员抢点头球攻门。” 在机会稍纵即逝的足球场上,教练这样费尽口舌地指挥队员比赛无疑是荒谬的。实际上这种 战术有一个名字叫作“下底传中” 。正因为战术有了对应的名字,在球场上教练可以很方便地和 球员交流。“下底传中”这种战术即是足球场上的一种“模式”。 在软件设计中亦是如此。我们都知道设计经验非常重要。也许我们都有过这种感觉:这个问 题发生的场景似曾相识,以前我遇到并解决过这个问题,但是我不知道怎么跟别人去描述它。我 们非常希望给这个问题出现的场景和解决方案取一个统一的名字,当别人听到这个名字的时候, 便知道我想表达什么。比如一个JavaScript新手今天学会了编写each函数,each函数用来迭代一个 数组。他很难想到这个each函数其实就是迭代器模式。于是他向别人描述这个函数结构和意图的 时候会遇到困难,而一旦大家对迭代器模式这个名字达成了共识,剩下的交流便是自然而然的事情。 学习模式的作用 小说家很少从头开始设计剧情,足球教练也很少从头开始发明战术,他们总是沿袭一些已经 存在的模式。当足球教练看到对方边后卫速度慢,中后卫身高矮时,自然会想到“下底传中”这 种模式。 同样,在软件设计中,模式是一些经过了大量实际项目验证的优秀解决方案。熟悉这些模式 的程序员,对某些模式的理解也许形成了条件反射。当合适的场景出现时,他们可以很快地找到 某种模式作为解决方案。 比如,当他们看到系统中存在一些大量的相似对象,这些对象给系统的内存带来了较大的负 担。如果他们熟悉享元模式,那么第一时间就可以想到用享元模式来优化这个系统。再比如,系 统中某个接口的结构已经不能符合目前的需求,但他们又不想去改动这个被灰尘遮住的老接口, 一个熟悉模式的程序员将很快地找到适配器模式来解决这个问题。 图灵社区会员 轩辕 专享 尊重版权 前 言 3 如果我们还没有学习全部的模式,当遇到一个问题时,我们冥冥之中觉得这个问题出现的几 率很高,说不定别人也遇到过同样的问题,并且已经把它整理成了模式,提供了一种通用的解决 方案。这时候去翻翻《设计模式》这本书也许就会有意外的收获。 模式在不同语言之间的区别 《设计模式》一书的副标题是“可复用面向对象软件的基础”。 《设计模式》这本书完全是从 面向对象设计的角度出发的,通过对封装、继承、多态、组合等技术的反复使用,提炼出一些可 重复使用的面向对象设计技巧。所以有一种说法是设计模式仅仅是就面向对象的语言而言的。 《设计模式》最初讲的确实是静态类型语言中的设计模式,原书大部分代码由C++写成,但 设计模式实际上是解决某些问题的一种思想,与具体使用的语言无关。模式社区和语言一直都在 发展,如今,除了主流
JavaScript设计模式与开发实践
温馨提示:如果当前文档出现乱码或未能正常浏览,请先下载原文档进行浏览。
本文档由 user 于 2020-12-27 09:14:17上传分享