三、UML
UML(United Modeling Language,统一建模语言):是一种基于面向对象的可视化建模语言。
UML采用了一组形象化的图形(如类图)符号作为建模语言,使用这些符号可以形象地描述系统的各个方面。
UML通过建立图形之间的各种关系(如类与类之间的关系)来描述模型。
UML中有二类图(共10种):
1).静态模型图:描述系统的静态结构
类图、对象图、包图、组件图、部署图
2).动态模型图:描述系统行为的各个方面
用例图、时序图、协作图、状态图、活动图。
其中蓝色为重点图例,其他的图例比较少用。
在画图之前我们有必要复习一下类的四种关系:
u 关联关系(association)
u 依赖关系(dependency)
u 泛化关系(generalization)
u 实现关系(realization)
我们在hibernate中有学习到这四种关系,原本我以为那只是在hibernate中使用。没想到在UML中也有,其实这四种关系应该是软件工程中的规范了。那hiberante也是使用了这种规范进行相关开发的,这样可以促进hibernate路线的正确性,这太好了!
我们使用的是IBM的RationalRoseUML设计工具,使用工具具体图画的操作就不说明了。
1.用例图
用例图(Use Case Diagram): 也称为用户模型图, 是从软件需求分析到最终实现的第一步, 它是从客户的角度来描述系统功能。
用例图包含 3 个基本组件:
1) 参与者(Actor): 与系统打交道的人或其他系统即使用该系统的人或事物。在UML中参与者用人形图标表示。
2) 用例(Use Case): 代表系统的某项完整的功能。在UML中使用一个椭圆来表示。
3) 关系: 定义用例之间的关系:
a) 泛化关系:表示同一业务目的(父用例)的不同技术实现(各个子用例)。 在UML中,用例泛化用一个三角箭头从子用例指向父用例。以下是某购物网站为用户提供不同的支付方式。
b) 包含关系:一个用例可以包含其他用例具有的行为, 并把它包含的用例行为作为自身行为的一部分。 在 UML 中包含关系用虚线箭头加 “<<include>>”, 箭头指向被包含的用例。
c) 扩展关系:如果在完成某个功能的时候偶尔会执行另外一个功能, 则用扩展关系表示。在 UML 中扩展关系用虚线箭头加 “<<extend>>”, 箭头指向被扩展的用例。
蓝线部分为:泛化关系。红线部分为:包含关系。绿线部分为:泛化关系。
2.类图
类图是面向对象系统建模中最常用的图,是定义其他图的基础。
类图主要是用来显示系统中的类, 接口以及它们之间的关系。
类图包含的主要元素有类, 接口和关系。 其中关系有关联关系, 泛化关系, 依赖关系和实现关系。 在类图中也可以包含注释和约束。
这里的关系十分重要,我们来一一看一下。
1). 泛化关系(继承关系):用来表示类与类, 接口与接口之间的继承关系. 泛化关系有时也称为”is a kind of”关系。
2). 实现关系:用来表示类与接口之间的实现关系。
3).依赖关系:比如我们上班需要交通工具,交通工具可以是公交车、私家车、电动车或自行车,步行也可以。这就是一依赖关系,使用某一个对象或对象的方法来完成一种功能。但与它不存在固定对应关系。
4).关联关系:对于两个相对独立的系统,当一个系统的实例与另一个系统的一些特定实例存在固定的对应关系时,这两个系统之间为关联关系。
多对多双向关联,可以自动生成代码哦:
关联关系中有一个难点,上面的图是多对多双向关联。我也可以映射出一对多和多对一的意向关联。但一对多关系中还有聚合关系和组成关系。
聚合关系:是更强形式的关联。强调部分和整体逻辑结构,但不强调生命周期。对应的属性具有get/set方法。例如计算机包含键盘和鼠标,但如果计算机不在了键盘和鼠标可以存。我们也可以为计算机换键盘和鼠标:
UML中组成关系:是更强形式的聚合,不仅强调部分和整体,而且还强调生命周期。仅有get方法。比如人有头和手,如果主体不在了,那么部分肯定也不存在了。也不能更换。
5).导航性:
导航性表示可从源类的任何对象到目标类的一个或多个对象遍历。 即:给定源类的一个对象, 可以得到目标类的所有对象。 可以在关联关系上加上箭头表示导航方向。
只在一个方向上可以导航的关联称为单向关联,用一个带箭头的方向表示; 在两个方向上都可以导航的关联称为双向关联, 用一条没有箭头的实线表示。
3. 时序图
时序图用于描述对象之间的传递消息的时间顺序, 即用例中的行为顺序。
当执行一个用例时, 时序图中的每条消息对应了一个类操作或者引起转换的触发事件。
在 UML 中, 时序图表示为一个二维的关系图, 其中, 纵轴是时间轴, 时间延竖线向下延伸。 横轴代表在协作中各个独立的对象。 当对象存在时, 生命线用一条虚线表示, 消息用从一个对象的生命线到另一个对象的生命线的箭头表示。 箭头以时间的顺序在图中上下排列。
时序图中的基本概念:
对象:时序图中对象使用矩形表示,并且对象名称下有下划线。将对象置于时序图的顶部说明在交互开始时对象就已经存在了。如果对象的位置不在顶部,表示对象是在交互的过程中被创建的。
生命线:生命线是一条垂直的虚线。表示时序图中的对象在一段生命周期内的存在。每个对象底部中心的位置都带有生命线。
消息:两个对象之间的单路通信。从发送方指向接收方。在时序图中很少使用返回消息。
激活:时序图可以描述对象的激活和钝化。激活表示该对象被占用以完成某个任务。钝化指对象处于空闲状态,等待消息。在 UML 中,对象的激活时将对象的生命线拓宽为矩形来表示的。矩形称为计划条或控制期。对象就是在激活条的顶部被激活的。对象在完成自己的工作后被钝化。
对象的创建和销毁:在时序图中, 对象的默认位置是在图的顶部。这说明对象在交互开始之前就已经存在了。如果对象是在交互过程中创建的,那么就应该将对象放到中间部分。如果要撤销一个对象,在其生命线终止点处放置“ X”符号。
5.活动图
活动图就是流程图,但在UML工具中可以加入泳道:
6.状态图
通过建立对象的生存周期模型来描述对象随时间变化的动态行为。比如hibernate中持久化对象的三种状态:临时状态、持久化状态、游离状态。
状态图的基本概念:
状态:用圆角矩形表示。状态名称表示状态的名字,通常用字符串表示。一个状态的名称在状态图所在的上下文中应该是唯一的。
转换:用带箭头的直线表示。一端连着源状态,一端连着目标状态。
初始状态:每个状态图都有一个初始状态。此状态代表状态图的起始位置。初始状态只能作为转换的源,不能作为转换的目标,并且在状态图中只能有一个。初始状态用一个实心圆表示。
终止状态:模型元素的最后状态,是一个状态图的终止点。终止状态在一个状态图中可以有多个。
7.协作图、对象图、包图
不画了,用处不大且非常简单。
8.组件图
组件图用来建立系统中各组件之间的关系,各组件通过功能组织在一起。
Javabean,ejb,jsp都是组件。在UML中,组件使用在左侧有两个小矩形的大矩形来表示。
组件图可以用来设计系统的整体构架:
9.部署图
部署图用来帮助开发者了解软件中的各个组件驻留在什么硬件位置,以及这些硬件之间的交互关系。
节点:用来表示一种硬件,可以是打印机,计算机等。节点的标记符号是一个三维框,在框的左上方包含了节点的名称。
通信关联:节点通过通信关联建立彼此的关系,采用从节点到节点绘制实线来表示关联。
一下子搞出来这么多东西,这么一看UML贯穿软件设计的各个阶段。让人感觉很好!
一定要学好软件工程,努力在工作中总结经验!