何谓设计模式

来源:互联网 发布:java程序员看什么书 编辑:程序博客网 时间:2024/06/06 22:30

    设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。

    经典的《Design Patterns: Elements of Reusable Object-Oriented Software》(即后述《设计模式》一书),由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著(Addison-Wesley,1995)。这几位作者常被称为"四人组(Gang of Four)   

    设计模式源于建筑设计,[GoF·第6章结论]中,介绍了设计模式的诞生与发展的历史:『建筑师Christopher Alexander第一个研究了建筑物和社区的模式,并开发了一个“模式语言”来生成它们。他的工作一次次地启发了我们』

    对于不熟悉建筑行业、也不熟悉“模式语言”的大多数程序员,模式/pattern,显得比较高大上。其实,我个人更喜欢的说法是:技法!例如中国象棋中残局的解决方案或杀法。

中国象棋的隐喻

例如这样一个盘局:


问题:在当前的局面下,红方如何战胜黑方。

会下中国象棋的人肯定能够找出办法:炮放在将的后面打黑车,就能够锁定胜局。这一常用的残局杀法,有一个名字叫“海底捞月”。


技法或模式(pattern)是特定环境/条件下的某一个问题的一种解决方案

特定环境:海底捞月的前提条件是红车占领中路。设计模式中,特定环境作为问题的一部分。

1.名字

    “海底捞月”代表了一个中国象棋盘局(问题)、这一盘局下的解决方案、各种变化和解决方案的效果。不管是棋手还是程序员,模式的名字,对于他们讨论问题很有帮助,这些名称是他们专业素养和专业词汇的一部分。文档是软件开发的重要组成部分,例如,一个框架如Spring的文档是学会使用该框架的程序员的重要资料。在文档中使用模式名,可以使懂得设计模式的人更快地了解系统。

在学习Java I/O流时,如果你懂得装饰模式和适配器模式,将会很轻松愉快。

2.问题描述

    大体上,[GoF]“记录”或者说归纳了23种设计模式。因而,它写道:『问题(problem),描述了应该在何时使用模式……有时候,问题部分会包括使用模式必须满足的一系列先决条件』。在[GoF·1.3描述设计模式]中说明:该书按照特定的模板描述每一个模式,该模板包括:模式名和分类、意图、动机、适用性、结构、参与者、协作、效果、实现、代码示例、已知应用和相关模式。所以,问题描述体现为“意图”和“动机”。这是归纳之后的总结。

假定我们的基本学习方法是推演,换言之,希望从问题出发,找出相应的技法或模式,那么,我们的问题描述 可能是从一个点出发,而得到的模式还可以应用到更多的方面。海底捞月的原理你知道了,当然红方的车兵如何战胜黑方的单车,也就不在话下。

3. 解决方案

    海底捞月的解决方案是棋谱——你不懂棋谱,自己会下也可以。

设计模式是设计中的解题模板,通常呈现为类图或者说结构。为了使读者更容易理解,书中或文章中常常添加类图,我们简单地采用BlueJ源代码所形成的简单类图。源代码将放在在designPattern文件夹中供读者下载。

4.评估

    象棋杀法的评价直截了当,成功或失败。设计模式的评估包含较多因素。基本的评估是该模式是否解决了特定的问题,使得设计更符合设计原则、软件更有弹性、可维护性。而『软件效果大多关注对时间和空间的衡量』,这种评估更多针对算法。


技法或模式(pattern)是特定环境/条件下的某一个问题的一种解决方案

设计模式有名字的、特定环境/条件下的某一个设计问题的解决方案。包含4个要素(虽然我们对4个要素都或多或少的有些修改).

其他定义:[GoF] 设计模式是对被用来在特定场景下解决一般设计问题的类和相互通信的对象的描述。


源自:http://blog.csdn.net/yqj2065/article/details/39104533