9设计模式概论

Posted sy-liu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了9设计模式概论相关的知识,希望对你有一定的参考价值。

  设计模式主要应用于面向对象软件设计领域,对于面向对象编程也有很好的指导意义。很多人都是通过对设计模式的学习和掌握才真正理解面向对象的。很多具有多年开发经验的Java或C#程序员它们一直采用面向对象语言来从事软件开发,但是基本上还是按照传统的结构化编程方式,不理解抽象类和接口有什么作用,不明白什么时候该用类继承什么时候该用对象关联,通过对设计模式的学习,他们才真正领悟到面向对象的魅力,更好地从事面向对象设计与编码工作。

  设计模式来源于众多专家的经验和智慧,是从许多优秀的软件系统中总结出的成功的、目的是为了更好的实现可维护性复用的设计方案,设计模式是在特定的环境下为解决某一通用软件设计问题提供的一套定制的解决方案,该方案描述了对象之间的相互作用,他是一套被反复用的、多数人知晓的、经过分类编目的、代码设计经验的总结。我们知道,随着软件寿命的延长和软件规模的扩大。如何更好地维护软件和实现软件的复用是现在软件界面临的一个很总要的问题,越来越多的时间、经历和金钱花费在软件的维护上,从某种意义上来说,设计模式的使用可以避免我们做一些重复性的工作,有助于提高设计和开发效率。

  此外设计模式提供了一套标准的设计词汇,方便开发人员之间交流,例如学过设计模式的人都知道适配器是怎么回事,都知道桥接模式应用于什么样的环境,都知道单例如何实现,也都知道迭代器是用来干啥的。除此之外,设计模式对于提高系统的可重用性、可扩展性以及设计方案的文档化具有重要的意义,对于面向对象的初学者而言,提高学习和掌握一些设计模式的知识有助于更好地理解面向对象的三大特性:封装、继承和多态,同时还能够帮助大家更好地阅读理解现有类库和框架的源码,降低学习成本。

设计模式的诞生于定义

  模式起源于建筑业而非软件业

  模式(Pattern)之父--美国加利福尼亚大学环境结构中心研究所所长Christopher Alexander博士

  《A Pattern Language:Towns,Buildings,Construction》--253个建筑和城市规划模式

模式

  Context(模式适用的前提条件)

  Theme或Problem(在前提条件下要解决的目标问题)

  Solution(对目标问题求解过程中各个物理关系的记述)

  1990年,软件工程界开始关注Christopher Alexander等在住宅、公共建筑与城市规划领域的重大突破,最早将该模式的思想引入软件工程方法学的是1991-1992年以“四人组(Gang of Four,GoF,分别是Erich Gamma Richard Helm,Ralph Johnson和John Vlissides)"自称的四位著名软件工程者,他们在1994年归纳发表了软件开发中使用频率最高的设计模式,意在用模式来统一沟通面向对象方法在分析、设计和实现之间的鸿沟。

  软件模式是将模式的一般概念应用于软件开发领域,即软件开发的总体指导思路或参照样板。软件模式并非仅限于设计模式,还包括架构模式、分析模式和过程模式等,实际上,在软件生存期的每个阶段都存在着一些被认同的模式。

  软件模式可以认为是对软件开发这一特定”问题“的”解法“的某种统一表示,它和Alexander所描述的模式定义完全相同,即软件模式等于一定条件下的出现的问题以及解法。软件模式的基础结构有4个部分构成:问题描述、前提条件(环境或约束条件)、解法和效果。

技术图片

 

  软件模式与具体的应用领域无关,在模式发现过程中需要遵循三大律(Rule of Three),即只有经过三个以上不同类型(或不同领域)的系统校验,一个解决方案才能从候选模式升格为模式。

  每个模式描述了一个我们周围不断重复发生的问题,以及该问题的解决方案的核心 --Christopher Alexander

  人是经验性的物种。设计模式描述了软件设计过程中某一类常见问题的一般性的解决方案。软件设计模式是软件设计领域设计经验的归纳与汇集

  事实上,很多行业都有自己的设计模式。就算设计模式本身不是起源于软件行业,而是起源于建筑行业。

  设计模式概念:设计模式是经过验证的,在特定的环境下重复出现的,针对特定问题的程序解决方案。

  从1995年至今,设计模式在软件开发中得以广泛应用,在Sun的Java SE/Java EE平台和Microsoft的.net平台设计中就用了大量的设计模式。

  诞生了越来越多的与设计模式相关的书籍和网站,设计模式也作为一门独立的课程或作为软件体系结构等课程的重要组成部分出现在国内外研究生和大学生的课堂上。

  设计模式一般有如下几个基本要素:模式名称、问题、目的解决方案、效果、实例代码和相关设计模式,其中的关键元素包括以下几个方面:

    设计名称(Pattern name)

    问题(Problem)

    解决方案(Solution)

    效果(Consequences)

技术图片

 

 

创建型模式

  抽象工厂模式(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)

游戏中常用模式

  单例模式、工厂模式、观察者模式、代理模式、命令模式、适配器模式、合成模式、访问者模式

设计模式的优点

  设计模式是从许多优秀的软件系统中总结出的成功的、能够实现可维护性复用的设计方案,使用这些方案将避免我们做一些重复性的工作,而且可以设计出高质量的软件系统。

  设计模式融合了众多专家的经验,并以一种标准的形式供广大开发人员所用,它提供了一套通用的设计词汇和通用的语言以便开发人员之间沟通和交流,使得设计方案更加通俗易懂。对于使用不同编程语言的开发和设计人员可以通过设计模式来交流系统设计方案,每个设计模式都对应一个标准的解决方案,设计模式可以降低开发人员理解系统的复杂度。

  设计模式使人们更加简单方便地复用成功的设计和体系结构,将已证实的技术表述成设计模式也会使系统开发者更容易理解其设计思路。设计模式使得重用成功的设计更加容易,并避免那些导致不可重用的设计方案。设计模式使得设计方案更加灵活,且易于修改。

  设计模式的使用将提高软件系统的开发效率和开发质量,在一定程度上节约设计成本。

  设计模式有助于初学者更深入的理解面向对象的思想,一方面可以帮助初学者更加方便的阅读和学习现有类库与其他系统的源代码,另一方面还可以提高软件的设计水平和代码质量。

Gof 23种设计模式

  历史性著作《设计模式:可复用面向对象的基础》一书中描述了23中经典面向对象设计模式,创立了设计模式在软件设计中的地位。

  由于《设计模式》一书确定了设计模式的地位,通常所说的设计模式隐含地表示”面向对象设计模式“,但这并不意味”设计模式“就等于”面向对象设计模式“,也不意味着23种设计模式就是面向对象设计模式的起点,非终点。

面向对象与设计模式

  面向对象设计模式解决的是”类与相互通信的对象之间的组织关系,包括他们的角色、职责、协作方式几个方面。

  面向对象设计模式是“好的面向对象设计”是那些可以满足“应对变化,提高复用”的设计。

  面向对象设计模式不像算法技巧,可以照搬照用,它是建立在对’面向对象“纯熟、深入理解的基础上经验性认识。掌握面向对象设计模式的前提是首先掌握”面向对象“!

恰当使用设计模式

  ”什么时候、什么地方应用设计模式"比”理解设计模式本身“更为重要。设计模式的应用不宜先入为主,一上来就使用设计模式是对设计模式的最大误用。没有一步到位的设计模式。

  现代软件设计的特征是”需求的频繁变化“。如果没有需求变化,便没有面向对象,更没有”面向对象设计模式“。设计模式的要点便是”寻找变化点,然后在变化点处应用设计模式,从而来更好的应对需求的变化

  敏捷软件开发实践提倡的“Refactoring to Patterns(重构与模式)“是目前普遍公认的最好的使用设计模式的方法。

用设计模式组织代码

  学设计模式,是为了学习如何合理的组织我们的代码,如何解耦,如何真正达到对修改封闭对扩展开放的效果。

  设计模式要是真的学会了,你们会发现在写代码的时候,脑子里根本没有什么设计模式,你都已经融会贯通了。代码写完了一看,这里有模式,那里也有模式。这就如同我们讲话不会去考虑语法。但是说出来的大部分的话都是符合语法要求的。这也如同我们写程序的时候不会总是去想程序的语法问题,我们自然而然写出来的东西就是可以编译的。道理都是一样的。

设计模式的扩展点

  不过为了合理的利用设计模式,我们应该明白一个概念,叫做扩展点扩展点不是天生就有的,而是设计出来的。我们设计一个软件架构的时候,我们也要同时设计一下哪些地方可以修改,哪些地方以后不能改。倘若你的设计不能满足现实世界的需要,那你就要重构,把有用的扩展点加进去,把没有用的扩展点去除掉。这跟你用不用设计模式没有关系。

  设计模式归根揭底就是因为你使用的程序语言的抽象能力不足才发明出来的。譬如那个Listener模式,在C#里面就是一个event关键字搞定,你不需要去写一大堆的框架代码来增加这个扩展点。相反,你在Java里面就需要这么做。因此你觉得Listener模式在Java中有用,在C#中没用,其实不是这样的。

设计模式方法:学习->应用->总结->学习

  C#创始人Anders Hejlsberg很牛,他帮你把这个设计模式做进了语法,你不需要痛苦地写一大堆框架代码就可以用了,这种东西就叫语法糖

  那到底我们怎样才能学会设计模式呢?答案只有一个,就是创造条件去使用设计模式。很多人觉得通过简单的程序和例子来学设计模式。这是不对的。设计模式就是因为情况复杂了才会出现的,所以我们只能通过复杂的程序来学习设计模式。你不管看别人的程序也好,自己写程序练也好,那必须要复杂,复杂到你不用设计模式就做不下去,这才能起到学习设计模式的作用。

  学习-应用-总结-学习

以上是关于9设计模式概论的主要内容,如果未能解决你的问题,请参考以下文章

设计模式学习笔记 概论

设计模式的学习:概论

38天刷完挑战程序设计竞赛&数论概论计划

设计模式概论与原则 & UML类图

数据挖掘报告

计算机概论速读问题