JavaScript 设计模式精讲系列
第一篇·你不知道的JavaScript 设计模式简介
写出可维护的代码的一个最重要的方面就是在代码中能够注意到重复出现的主题并对其进行优化。设计模式的知识领域是无价的。
设计模式可以追溯到早期的一名叫Christopher Alexander的建筑师。他经常会发表一些他在处理设计问题时的经验和如何与建筑和城镇相联系的。有一天,当Alexander使用了一次又一次后,他发现某些设计结构会导致做出的效果是最好的。
在Sara Ishikawa和Murray Silverstein的协作下,Alexander发明了一种可以帮助授权任何人去设计和构建希望的任何规模的模式语言。这在1977年的一篇名为"A Pattern Language"的论文中发表,在后来作为一本完整的精装书发表。
大约30年前,软件工程师开始将Alexander曾写过的原理并入第一版的设计模式,这是一个用来对那些想要改善他们编码技巧的新手开发者的一个指南。要注意,这时设计模式背后的概念实际上已经在编程行业成立以来就有了,虽然不是那么正式的形式。
第一个也是最标志性的关于软件工程的设计模式的正式作品是在1995年一本叫
的书中发表,这是Erich Gamma, Richard Helm, Ralph Johnson和 John Vlissides - 一群被称为Gang of Four(简称GoF)的人写的。
GoF的出版物被认为是非常有助于推动设计模式的概念在我们的领域发展的,因为它描述了大量的开发技术和缺陷,而且还有在今天的世界中大量使用的23个核心的面向对象的设计模式。我们将详细地在"设计模式分类"这一篇中介绍这些模式。
目的 |
设计模式 |
可变的方面 |
创建 |
Abstract Factory Builder Factory Method Prototype Singleton |
产品对象家族 如何创建一个组合对象 被实例化的子类 被实例化的类 一个类的唯一实例 |
结构 |
Adapter Bridge Composite Decorator Facade Flyweight Proxy |
对象的接口 对象的实现 一个类的结构和组成 对象的职责,不产生子类 一个子系统的接口 对象的存储开销 如何访问一个对象;该对象的位置 |
行为 |
Chain of Responsibility Command Interpreter Iterator Mediator Memento Observer State Strategy Template Method Visitor |
满足一个请求的对象 何时、怎么样满足一个请求 一个语言的文法以及解释 如何遍历、访问一个聚合的各元素 对象间怎么样交互、和谁交互 一个对象中哪些私有信息存放在该对象之外,以及在什么时候进行存储 多个对象依赖于另外一个对象,而这个对象如何保持一致 对象的状态 算法 算法中的某些步骤 某些可做用于一个对象上的操作,但不修改这个对象的类 |
JavaScript 什么是设计模式?
一个模式就是一个可重用的方案,可应用于在软件设计中的常见问题 - 在我们的例子里 - 就是编写JavaScript的web应用程序。模式的另一种解释就是一个我们如何解决问题的模板 - 那些可以在许多不同的情况里使用的模板。那么理解和熟悉模式为什么是如此的重要?设计模式有以下三点好处:
- 模式是行之有效的解决方法:他们提供固定的解决方法来解决在软件开发中出现的问题,这些都是久经考验的反应了开发者的经验和见解的使用模式来定义的技术。
- 模式可以很容易地重用:一个模式通常反映了一个可以适应自己需要的开箱即用的解决方案。这个特性让它们很健壮。
- 模式善于表达:当我们看到一个提供某种解决方案的模式时,一般有一组结构和词汇可以非常优雅地帮助表达相当大的解决方案。
我们认为不满足准则的模式原型不值得学习,这可以得到谅解,然而,事实远不是这样的。许多模式原型确实非常的好。我不是说所有的模式原型都值得看,不过总有几个在自然环境下成长的有用的模式原型可以在未来的项目中帮到我们。从心底里使用上面列表来做最佳评判的话,你在选择哪个是模式的过程中将感觉非常愉快。
模式是否有效的附加要求之一是模式要展示某些重现现象。这个就是至少在三个关键方面 ,也就是三条规则验证是否取得资格经常要做的事情。为了展示使用这个规则后的重现,模式必须证明其:
- 适用性-模式怎样才能被认为是成功的。
- 有用性-为什么认为这个模式是成功的?
- 可用性 -因为设计得到广泛的应用,所以认为这个设计就是模式吗?如果是这样的话,那么需要说明。重新审核或者定义模式的时候,牢记以上规则非常重要。
本篇结束语:坚持下去你就是那个强者
在js设计模式系列解读的系列性文章中,我们将看到一些流行的JavaScript设计模式,并探索为什么一些特定的模式比其他的更适合你的项目
我们下一篇《JavaScript 设计模式的分类》见