模式的诞生
模式(Pattern)起源于建筑业而非软件业
模式之父——美国加利佛尼亚大学环境结构中心研究所所长Christopher Alexander(克里斯托弗·亚历山大)博士
《A Pattern Language: Towns, Buildings, Construction》——253个建筑和城市规划模式。
他给出了模式的经典定义: 每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心,通过这种方式,人们可以无数次地重用那些已有的解决方案,无须再重复相同的工作
定义
模式是在特定环境下人们解决某类重复出现问题的一套成功或有效的解决方案。
要点
1.Context(模式可适用的前提条件)
2.Theme或Problem(在特定条件下要解决的目标问题)
3.Solution(对目标问题求解过程中各种物理关系的记述)
软件设计模式的发展
从1995年至今,设计模式在软件开发中得以广泛应用,在Sun的Java SE/Java EE平台和Microsoft的.NET平台设计中应用了大量的设计模式。
轻量级框架:Struts、Spring、Hibernate、JUnit、NHibernate、NUnit ……
语言:C++、Java、C#、Objective-C、 VB.net、Smalltalk、PHP、 Delphi、JavaScript、Ruby……
得到越来越多的企业和高校的关注与重视
越来越多的书籍和网站
软件设计模式的定义
设计模式是在特定环境下为解决某一通用软件设计问题提供的一套定制的解决方案,该方案描述了对象和类之间的相互作用。
软件设计模式一般包含模式名称、问题、目的、解决方案、效果、实例代码和相关设计模式等基本要素,其中包含以下4个关键要素:
1.模式名称 (Pattern Name):一个助记名,它用一两个词来描述模式的问题、解决方案和效果。
2.问题 (Problem):描述了应该在何时使用模式。
3. 解决方案 (Solution):描述了设计的组成成分,它们之间的相互关系及各自的职责和协作方式。
4. 效果 (Consequences):描述了模式应用的效果及使用模式应权衡的问题。
软件设计模式的分类
按目的分为:
1.创建型模式:用于特定对象的创建,提供解决建议
2.结构型模式:用于处理类或对象的组合关系进行设计(元件间关系),为代码的稳定性、可扩展性等提供解决建议
3.行为型模式:用于描述类或对象如何交互和怎样分配职责
按范围分为:
1.类模式:处理类和子类之间的关系,这些关系通过继承建立,在编译时刻就被确定下来,是一种静态关系。
2.对象模式:处理对象间的关系,这些关系在运行时变化,更具动态性。
软件设计模式的优点
1.融合了众多专家的经验,并以一种标准的形式供广大开发人员所用
2.提供了一套通用的设计词汇和一种通用的语言,以方便开发人员之间进行沟通和交流,使得设计方案更加通俗易懂
3.让人们可以更加简单方便地复用成功的设计和体系结构
4.使得设计方案更加灵活,且易于修改
5.将提高软件系统的开发效率和软件质量,且在一定程度上节约设计成本
6.有助于初学者更深入地理解面向对象思想,方便阅读和学习现有类库与其他系统中的源代码,还可以提高软件的设计水平和代码质量
UML类图定义
类是具有相似结构、行为和关系的一组对象的描述符。类图显示了一组类、接口、协作以及他们之间的关系。
在UML中问题域最终要被逐步转化,通过类图来建模,通过编程语言构建这些类从而实现系统。
作用域
关系
泛化(Generalization):表示类之间的继承关系,注意是子类指向父类。UML中用带空心三角箭头的实线表示泛化关系,箭头指向的是一般个体。
实现(Realization):在Java中是一个class类实现interface接口(可多个)的功能,此类关系通过关键字implements明确标识。UML中用带三角箭头的虚线表示实现,箭头指向接口。
依赖(Dependency):表示的是类之间的调用关系,代码体现在局部变量、方法的参数或者对静态方法的调用。UML中用带箭头的虚线表示依赖关系,而箭头所指的则是被依赖的类。
关联(Association):类与类之间的一种拥有的关系,用于表示一类对象与另一类对象之间有联系。UML中用没有、单向或双向带箭头的实线表示关联关系,线上标注动词或者名词表示角色名。关联分为单向关联、双向关联和自关联3种。
聚合(Aggregation):是关联关系的一种特例,表示的是整体与部分之间的关系,部分可以离开整体单独存在。UML中用空心菱形头的实线表示聚合关系,菱形头指向整体。
组合(Composition):是一种强的‘拥有’关系,是一种contains-a的关系,体现了严格的部分和整体关系,代表整体的对象负责代表部分的对象的生命周期,二者具有相同的生命周期。UML中用实心菱形头的实线来表示组合,菱形头指向整体。