设计模式概述

     设计模式

      软件开发技术也包括一些招式和内功:Java、C#、C++等编程语言,Eclipse、Visual Studio 等开发工具,JSP、ASP.net等开发技术,Struts、Hibernate、JBPM等框架技术,所有这些我们 都可以认为是招式;而数据结构、算法、设计模式、重构、软件工程等则为内功。招式可以 很快学会,但是内功的修炼需要更长的时间。我想每一位软件开发人员也都希望成为一名兼 具淋漓招式和深厚内功的“上乘”软件工程师,而对设计模式的学习与领悟将会让你“内功”大 增,再结合你日益纯熟的“招式”,你的软件开发“功力”一定会达到一个新的境界。

     1.设计模式从何而来?

     在介绍设计模式的起源之前,我们先要了解一下模式的诞生与发展。与很多软件工程技术一 样,模式起源于建筑领域,毕竟与只有几十年历史的软件工程相比,已经拥有几千年沉淀的 建筑工程有太多值得学习和借鉴的地方。

     那么模式是如何诞生的?让我们先来认识一个人——Christopher Alexander(克里斯托弗.亚历 山大),哈佛大学建筑学博士、美国加州大学伯克利分校建筑学教授、加州大学伯克利分校 环境结构研究所所长、美国艺术和科学院院士……头衔真多,微笑,不过他还有一个“昵 称”——模式之父(The father of patterns)。Christopher Alexander博士及其研究团队用了约20年的 时间,对住宅和周边环境进行了大量的调查研究和资料收集工作,发现人们对舒适住宅和城 市环境存在一些共同的认同规律,Christopher Alexander在著作A Pattern Language: Towns, Buildings, Construction中把这些认同规律归纳为253个模式,对每一个模式(Pattern)都从 Context(前提条件)、Theme或Problem(目标问题)、 Solution(解决方案)三个方面进行 了描述,并给出了从用户需求分析到建筑环境结构设计直至经典实例的过程模型。这个定义可以简单地用一句话表示:模式是在特定环境下人们解决某类重复出现问题的一套成功或有效的解决方案。【A pattern is a successful or efficient solution to a recurring problem within a context】1990年,软件工程界开始关注ChristopherAlexander等在这一住宅、公共建筑与城市规划领域的 重大突破。最早将模式的思想引入软件工程方法学的是1991-1992年以“四人组(Gang of Four, 简称GoF,分别是Erich Gamma, Richard Helm, Ralph Johnson和John Vlissides)”自称的四位著名 软件工程学者,他们在1994年归纳发表了23种在软件开发中使用频率较高的设计模式,旨在 用模式来统一沟通面向对象方法在分析、设计和实现间的鸿沟。从1995年至今,无论是在大型API或框架(如JDK、.net Framework等)、轻量级框架(如 Struts、Spring、 Hibernate、JUnit等)、还是应用软件的开发中,设计模式都得到了广泛的应 用。如果你正在从事面向对象开发或正准备从事面向对象开发,无论你是使用Java、C#、 Objective-C、VB.net、Smalltalk等纯面向对象编程语言,还是使用C++、PHP、Delphi、 JavaScript等可支持面向对象编程的语言。

     2.设计模式是什么?

    设计模式的一般定义如下: 设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过 分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人 理解并且保证代码可靠性。设计模式一般包含模式名称、问题、目的、解决方案、效果等组成要素,其中关键要素是模 式名称、问题、解决方案和效果。

     3.设计模式有什么用?

    使用这些方案将可以让我们避免做一些重复性的工作, 也许我们冥思苦想得到的一个“自以为很了不起”的设计方案其实就是某一个设计模式。设计模式提供了一套通用的设计词汇和一种通用的形式来方便开发人员之间沟通和交流, 使得设计方案更加通俗易懂。

    大部分设计模式都兼顾了系统的可重用性和可扩展性,这使得我们可以更好地重用一些已 有的设计方案、功能模块甚至一个完整的软件系统,避免我们经常做一些重复的设计、编写 一些重复的代码。合理使用设计模式并对设计模式的使用 情况进行文档化,将有助于别人更快地理解系统。(5) 最后一点对初学者很 重要,学习设计模式将有助于初学者更加深入地理解面向对象思想,让你知道:如何将代码 分散在几个不同的类中?为什么要有“接口”?何谓针对抽象编程?何时不应该使用继承?如果 不修改源代码增加新功能?同时还让你能够更好地阅读和理解现有类库(如JDK)与其他系统 中的源代码,让你早点脱离面向对象编程的“菜鸟期”。

原文地址:https://www.cnblogs.com/feimaoyuzhubaobao/p/10041817.html