设计模式简介
1. 起源
设计模式来源于土木工程师克里斯托弗·亚历山大的早期作品。他经常发表一些作品,内容是总结他在解决设计问题方面的经验,以及这些知识与城市和建筑模式之间的关系,通过总结他发现,重复使用这些模式可以让某些设计构造取得我们期望的最佳效果。之后,亚历山大在1977年发表了《建筑模式语言》,为的就是帮助设计师能够提高自己的设计能力,以解决任何规模的设计和建筑挑战。
80年代初,软件工程师开始把亚历山大编写的建筑设计原则纳入首个有关设计模式的文档中,成为初级开发人员改进编程技巧的指南。
说到设计模式,就不得不提到关于软件工程设计模式的最早和最具代表性的作品,那就是1995年出版的《设计模式:可复用面向对象软件的基础》这一本书。该书的作者有四个,分别是Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides,他们以Gang of Four
著称(GoF)。
GoF发表的著作大大推动了设计模式概念在编程领域中的进一步发展,因为它描述了很多开发技术的误区,并列举了23个面向对象设计中最常用的经典设计模式。
2. 什么是模式
模式是一种可复用的解决方案,可用于解决软件设计中遇到的常见问题。设计模式有三大好处,
- 模式是已经验证的解决方案,可以为解决软件开发中遇到的问题提供可靠的方法。
- 模式很容易被复用,模式通常是指一种立即可用的解决方案,可以对其进行修改以满足个人的需求。
- 模式富有表达力。看到模式时,通常就是表示有一个设置好的结构和表达解决方案的词汇,以帮助我们非常轻松地表达出所实现的大型解决方案。
3. 反模式
反模式这个术语是1995年由安德鲁·凯尼格在当年的11月C++报告中创造的。反模式的概念涉及两个方面
- 描述一种针对某个特定问题的不良解决方案,该方案会导致糟糕的情况发生。
- 描述如何摆脱前述的糟糕情况以及如何创造好的解决方案。
简单的理解就是,如果我们认为一种模式代表一种最佳的实践,那么一个反模式就代表我们已经学到的教训。因此,反模式是一种值得记录的不良设计,例如JavaScript中的反模式示例就有
- 在全局环境中定义大量的变量污染全局命名空间。
- 在setTimeout或setInterval传递字符串,而不是函数,这会触发eval()的内部使用。
- 修改Object类的原型
4. 设计模式的类别
设计模型可以划分为很多不同的类别,常见的大致有三种
4.1 创建型设计模式
创建型设计模式
专注于处理对象创建机制,以适合给定情况的方式来创建对象。创建对象的基本方法可能导致项目复杂性增加,而这些模式旨在通过控制创建过程来解决这种问题。
属于这类别的模式有
- Contructor(构造器)
- Factory(工厂)
- Abstact(抽象)
- Prototype(原型)
- Singleton(单例)
- Builder(生成器)
4.2 结构型设计模式
结构型模式
与对象的组合有关,通常可以用于找出在不同对象之间建立关系的简单方法。这种模式有助于确保系统某一部分发生变化时,系统的整个结构不需要同时改变。同时对于不适合因某一特定目的而改变的系统部分,这种模式也能够帮助它们完成重组。
属于这类别的模式有
- Decorator(装饰者)
- Facade(外观)
- Flyweight(亨元)
- Adapter(适配器)
- Proxy(代理)
4.3 行为设计模式
行为设计模式
专注于改善或简化系统中不同对象之间的同信。
属于这类别的模式有
- Iterator(迭代器)
- Mediator(中介者)
- Observer(观察者)
- Visitor(访问者)
5. 个人理解
总的来说,设计模式的学习和理解都应该在编程语言的案例中进行,设计模式并不是一日形成的,而是在常年的实践中的经验总结,学习设计模式,也是在学习如何更好地解决日常的软件开发所遇到的问题。本章节以设计模式的简介开始,将会围绕这JavaScript语言展开设计模式的探讨之旅。
本章来源
本系列的设计模式的内容都是基于Addy Osmani的JavaScript设计模式