1 设计模式从何而来 ?
1.1先要了解一下模式的诞生与发展。与很多软件工程技术一 样,模式起源于建筑领域;
那么模式是如何诞生的?让我们先来认识一个人——Christopher Alexander(克里斯托弗.亚历 山大),哈佛大学建筑学博士、美国加州大学伯克利分校建筑学教授、加州大学伯克利分校 环境结构研究所所长、美国艺术和科学院院士……头衔真多,微笑,不过他还有一个“昵 称”——模式之父(The father of patterns)。Christopher Alexander博士及其研究团队用了约20年的 时间,对住宅和周边环境进行了大量的调查研究和资料收集工作,发现人们对舒适住宅和城 市环境存在一些共同的认同规律,Christopher Alexander在著作A Pattern Language: Towns, Buildings, Construction中把这些认同规律归纳为253个模式,对每一个模式(Pattern)都从 Context(前提条件)、Theme或Problem(目标问题)、 Solution(解决方案)三个方面进行 了描述,并给出了从用户需求分析到建筑环境结构设计直至经典实例的过程模型。 在Christopher Alexander的另一部经典著作《建筑的永恒之道》中,
他给出了关于模式的定 义: 每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核 心,通过这种方式,我们可以无数次地重用那些已有的成功的解决方案,无须再重复相同的 工作。模式是在特定环境下人们解决某类重复出现问题的一套成功或有效的解决方案。【A pattern is a successful or efficient solution to a recurring problem within a context】
1.2软件设计模式起源:
1990年,软件工程界开始关注ChristopherAlexander等在这一住宅、公共建筑与城市规划领域的 重大突破。最早将模式的思想引入软件工程方法学的是1991-1992年以“四人组(Gang of Four, 简称GoF,分别是Erich Gamma, Richard Helm, Ralph Johnson和John Vlissides)”自称的四位著名 软件工程学者,他们在1994年归纳发表了23种在软件开发中使用频率较高的设计模式,旨在 用模式来统一沟通面向对象方法在分析、设计和实现间的鸿沟。
GoF将模式的概念引入软件工程领域,这标志着软件模式的诞生。软件模式(Software Patterns) 是将模式的一般概念应用于软件开发领域,即软件开发的总体指导思路或参照样板。软件模 式并非仅限于设计模式,还包括架构模式、分析模式和过程模式等,实际上,在软件开发生 命周期的每一个阶段都存在着一些被认同的模式。 软件模式是在软件开发中某些可重现问题的一些有效解决方法,软件模式的基础结构主要由 四部分构成,包括问题描述【待解决的问题是什么】、前提条件【在何种环境或约束条件下 使用】、解法【如何解决】和效果【有哪些优缺点】,如图1-1所示:
1995年, GoF将收集和整理好的23种设计模式汇编成Design Patterns: Elements of Reusable Object-Oriented Software【《设计模式:可复用面向对象软件的 基础》】一书,该书的出版也标志着设计模式正式成为面向对象(Object Oriented)软件工程的 一个重要研究分支。
2.设计模式是什么?
2.1设计模式的一般定义如下:
设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过 分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人 理解并且保证代码可靠性。 狭义的设计模式是指GoF在《设计模式:可复用面向对象软件的基础》一书中所介绍的23种经 典设计模式,不过设计模式并不仅仅只有这23种,随着软件开发技术的发展,越来越多的新 模式不断诞生并得以应用。
2.2设计模式要素:
设计模式一般包含模式名称、问题、目的、解决方案、效果等组成要素,其中关键要素是模 式名称、问题、解决方案和效果。
2.3我们大部分听到的是24种设计模式,多出来的那个是啥?
有一个设计模式虽然不属于GoF 23种设计模式,但一般在介绍设计模式时都 会对它进行说明,它就是简单工厂模式,也许是太“简单”了,GoF并没有把它写到那本经典著 作中,不过现在大部分的设计模式书籍都会对它进行专门的介绍。
2.4设计模式有哪些?怎么分类?
设计模式一般有两种分类模式:
2.4.1根据目的分类:创建型、结构型、行为型(模式是用来做什么的) 这个比较常用
创建型模式,共五种: 工厂方法模式、抽象工厂模式、单例模式、构建者模式、原型模式。
结构型模式,共七种: 适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种: 策略模式、、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式
其实还有两类:并发型模式和线程池模式。
2.4.2根据范围分类:行为类模式和对象模式。
范围/目的 | 创建型模式 | 结构型模式 | 行为型模式 |
---|---|---|---|
类模式 | 工厂方法模式 | (类)适配器模式 |
解释器模式 模板方法模式 |
对象模式 |
简单工厂模式 抽象工厂模式 单例模式 建造者模式 原型模式 |
(对象)适配器模式 桥接模式 组合模式 装饰模式 外观模式 享元模式 代理模式
|
职责链模式 命令模式 迭代器模式 中介者模式 备忘录模式 观察者模式 状态模式 策略模式 访问者模式 |
3.设计模式有什么用
(1) 设计模式来源众多专家的经验和智慧,它们是从许多优秀的软件系统中总结出的成功的、 能够实现可维护性复用的设计方案,使用这些方案将可以让我们避免做一些重复性的工作, 也许我们冥思苦想得到的一个“自以为很了不起”的设计方案其实就是某一个设计模式。在时间 就是金钱的今天,设计模式无疑会为有助于我们提高开发和设计效率,但它不保证一定会提 高。
(2) 设计模式提供了一套通用的设计词汇和一种通用的形式来方便开发人员之间沟通和交流, 使得设计方案更加通俗易懂。交流通常很耗时,任何有助于提高交流效率的东西都可以为我 们节省不少时间。无论你使用哪种编程语言,做什么类型的项目,甚至你处于一个国际化的 开发团队,当面对同一个设计模式时,你和别人的理解并无二异,因为设计模式是跨语言、 跨平台、跨应用、跨国界的。
(3) 大部分设计模式都兼顾了系统的可重用性和可扩展性,这使得我们可以更好地重用一些已 有的设计方案、功能模块甚至一个完整的软件系统,避免我们经常做一些重复的设计、编写 一些重复的代码。此外,随着软件规模的日益增大,软件寿命的日益变长,系统的可维护性 和可扩展性也越来越重要,许多设计模式将有助于提高系统的灵活性和可扩展性,让我们在 不修改或者少修改现有系统的基础上增加、删除或者替换功能模块。如果一点设计模式都不 懂,我想要做到这一点恐怕还是很困难的。
(4) 合理使用设计模式并对设计模式的使用 情况进行文档化,将有助于别人更快地理解系统。如果某一天因为升职或跳槽等原因,别人 接手了你的项目,只要他也懂设计模式,我想他应该能够很快理解你的设计思路和实现方 案,让你升职无后患之忧,跳槽也心安理得,何乐而不为呢?
(5) 最后一点对初学者很 重要,学习设计模式将有助于初学者更加深入地理解面向对象思想,让你知道:如何将代码 分散在几个不同的类中?为什么要有“接口”?何谓针对抽象编程?何时不应该使用继承?如果 不修改源代码增加新功能?同时还让你能够更好地阅读和理解现有类库(如JDK)与其他系统 中的源代码,让你早点脱离面向对象编程的“菜鸟期“。
详细的各个设计模式实现与应用细节,请去我的微博中查阅