设计模式系列-面向对象葵花宝典-UML
声明:本系列为面向对象葵花宝典一书学习总结内容,原作者博客链接
10. UML
10.1.UML简介
UML,Unified Modeling Language,中文翻译为“统一建模语言”10.2. UML 只是语言
最常见的误解是:掌握 UML,就掌握了设计;设计就是画 UML 图。
UML 是一种用在面向对象建模领域的语言,是一种“表达”和“交流”的方式。
只有设计出来后,再用 UML 进行表达 ,UML != 设计。10.3. UML 应用
用 UML 的根本目的是为了表达你的设计思想。
对于普通人来说,UML 复杂和严格的规范,并不是需要我们每个人都精确的掌握。10.4. 需求分析阶段
10.4.1. 用例图
用例图(Use Case Digram),是软件开发过程中第一个 UML 图。
用例图最大的作用是将复杂的用户需求通过图形清晰的表达出来。
站在客户角度观察到的, 直观的描述系统对外提供的功能。
用例图包含三个主要的元素:角色、系统、用例
![]()
角色:图中的小人即角色
系统:图中的边框即系统
用例:图中的椭圆即用例如何识别角色?
笼统的讲:只要和系统有交互的外部实体都是角色,并非只是真实的人。常见的角色
使用者:使用系统服务的人和系统 以微博为例:微博用户就是使用者
维护者:维护和管理系统的人和系统 以微博为例:运维人员、微博小秘书等都是维护者
监管者:监控和约束系统的人和系统 以微博为例:安全部门、政府人员、绿网
依赖者:依赖系统存在的人和系统 以微博为例:其它网站、基于微博 API 开发的 APP用例图的关系
角色和用例的关系 无关系、关联关系 上图中“学生”和“查看分数”有关联关系用例和用例的关系
继承,子用例是父用例的一个特殊实现。
在 UML 用例图中,泛化是通过带三角箭头的连接线表示的,箭头指向的一端是父用例,另一端是子用例。(后续如何记忆这些不同的标识会单独说明)
![]()
包含,就是某一个用例又包含更多的小用例。
在 UML 用例图中,包含是通过一个带箭头的虚线表示的,并且会有一个关键标识“<>”,箭头所指的用例是小用例,另一端是大用例。
![]()
扩展,指在原有用例功能上的一个扩展和延伸。
在 UML 图中,扩展的表示方式和包含类似,通过一个带箭头的虚线表示,并且有一个关键标识
“extend”,箭头所指的用例是基础用例,另一端是扩展用例。
依赖,指某个用例功能必须依赖另外一个用例才能完成。
这个关系不是 UML 标准的关系,但其实在实际应用中是很常见的,例如:发微博之前要登录。
10.5. 设计阶段
类图
类图主要包含两部分:类定义和类关系
类定义:用来表示某个类
类关系:用来表示类之间的关系。
类定义图包含三部分:类名称、属性区、方法区,正好与代码层面的类结构一一对应。
(+ public -private # protected)
public class Student { public int number; //学号 public String name; //姓名 public int grade; //年级 private int age; //年龄 /** * 学习 */ public void study(){ } /** * 考试 */ public void test(){ } /** * 玩耍 */ public void play(){ } /** * 谈恋爱 */ public void love(){ } }接口
接口的表现方法有点令人惊讶:只是一个圆圈而已,而且给了一个很可爱的名字:棒棒糖!
![]()
UML 更早的版本中,是通过一个 interface 的标记来表示的
类关系图
继承
在 UML 图中,是通过一个带空心三角形箭头的连接线来表示继承,三角形指向的一端是父类,另一端是子类。
实现
实现是“继承”的一种特殊实现,即:当一个类继承某个接口的时候,我们称为实现。
UML 中通过一个虚线带一个空心三角箭头来表示实现,和继承的差别仅在于一个是实线,一个是虚线。(旧版)
新版的棒棒糖表示
关联
关联,就是指两个类之间有联系(主被动结构)(主宾结构)
你和公司签订了劳动合同,那么合同类、公司类、员工类就有关联关系了
公司属于合同内容之一 员工属于合同内容之一
依赖
依赖是比关联更强的一种关系,一个类“依赖”了另外一个类,就意味着一旦被依赖的类发生改变,则依
赖类也必须跟着改变。(A调用B A依赖B)
![]()
Supplier 中文翻译为“供应商”,我觉得非常贴切的形容了依赖关系。既然是供应商,总得供应一些什么东
东吧。要么供应服务(对应方法调用),要么供应内容(对应数据),甚至供应 Supplier 本身。组合 && 聚合
聚合和组合关系是一种“整体 - 部分”的关系。(ABC组成了D)
依赖关系可以形象的描述为“没有你,我寸步难行”,而聚合和组合则可以形象的描述为“没有你,我将不存在”。
那为何又分为聚合和组合两种呢?
聚合:是一种“has a”的关系,即:某个类包含另外一个类,但并不负责另外类的维护,且两个类的对
象生命周期是不一样的,“整体”销毁后,“部分”还能继续存在。
组合:是一种“owns a”的关系,即:某个类包含另外一个类,且还要负责另外类的维护,且两个类的对
象生命周期是一样的,“整体”销毁后,“部分”同样被销毁了。
在 UML 中,聚合是通过一个带空心菱形的连接线来表示的,菱形所在的一端是“整体”,另一端是“部分”。组合的表达方式和聚合基本一致,只是菱形由空心改为实心的。
![]()
![]()
动态图
类图、类关系图结合起来,已经向我们完整的描述了一个系统的静态结构。但一个系统要能够运行起来,
光有静态结构肯定是不行的。
UML 中使用动态图来描述一个系统的动态行为,包含“状态图”、“序列图”、“协作图”、“活动图”4 种。状态图
状态图主要用于描述一个对象的生命周期内的状态变化。有了状态图,我们就能够详细的了解某个关键对
象的状态变化,以及触发这些变化的因素。
UML 的状态可以分为 3 类:初始态、终止态、中间态。
如下图:实心圆圈代表初始态,圆角方框代表中间态,实心圆环代表终止态,箭头表示状态转换。
活动图
活动图主要用于描述一个工作流程或者计算流程。其关注点是在完成某项工作的过程中,系统中的哪些对
象承担了什么样的任务、做了什么处理,以及这些对象之间的先后交互关系。
序列图
序列图主要用于描述对象按照时间顺序组织的消息交互过程,其关键特征是强调按照“时间顺序”来组织
对象的交互,所以序列图有时又称为“时序图”或者“顺序图”。
序列图具有非常明显的一个特征:时间线,或者叫做生命线。
![]()
协作图
协作图主要用于描述按照对象之间的关联来组织的消息交互过程,其关键特征是强调“对象关系”来组织
对象的交互。
序列图具有非常明显的一个特征:时间线,或者叫做生命线。
![]()
后续的设计模式分析内容会有单独的UML类图的识别练习以及记忆方法。
本文介绍UML(统一建模语言)的基础概念及其在软件需求分析与设计阶段的应用,包括用例图、类图、接口、类关系图及动态图等内容。
1363

被折叠的 条评论
为什么被折叠?



