我正在参加「掘金·启航计划」
定义
UML即统一建模语言(Unified Modeling Language) ,它是一种开放的方法,用于说明、可视化、构建和编写一个正在开发的、面向对象的、软件密集系统的制品的开放方法。
UML展现了一系列最佳工程实践,这些最佳实践在对大规模,复杂系统进行建模方面,特别是在软件架构层次已经被验证有效。
UML是一种图形化语言,支持模型化和软件系统开发。
UML”4+1”视图
逻辑视图
逻辑视图关注的静态元素是层、子系统、类和接口,这些用类图来描述。而逻辑视图关注的动态因素是协作关系,用时序图、协作图、状态图等来描述。
在架构设计中体现类和类之间的关系取决于设计的层级。
开发视图
开发视图(实现实体)关注的元素是程序包(SDK、解析器、中间件)、文件组织结构、编译依赖关系、目标单元(jar、exe、dll等)。它和逻辑视图的静态元素通常有映射关系。
运行视图
运行视图(进程视图)关注进程、线程和对象等运行时概念,以及相关的并发、同步和通信等问题。
运行架构和开发架构的关系:开发架构一般偏重程序包在编译时期的静态依赖关系,而这些程序运行起来之后会表现为对象、线程、进程吗,而运行架构比较关注的是这些运行时单元的交互问题。
部署视图
部署视图关注“目标程序及其依赖的运行库和系统软件”最终如何安装或部署到物理机器,以及如何部署机器和网络来配合软件系统的可靠性、可伸缩性等要求。
部署视图和运行视图的关系:运行视图特别关注目标程序的动态执行情况,而部署视图重视目标程序的静态位置问题;部署视图还要考虑软件系统和包括硬件在内的整个IT系统之间是如何相互影响的。
三个基本的部分
- 事物(Things) UML中重要的组成部分,在模型中属于最静态的部分,代表概念上的或物理上的元素。
- 关系(Relationships) 关系把事物紧密联系在一起。
- 图(Diagrams) 图是很多有相互相关的事物的组。
4种类型的事物
- 结构事物(Structural things)
- 动作事物(Behavioral things)
- 分组事物(Grouping things)
- 注释事物(Annotational things)
UML中的关系
- 依赖(Dependencies)
- 关联(Association)
- 泛化(Generalization)
- 实现(Realization)
UML中的9种图
- 类图(Class diagram)
- 对象图(Object diagram)
- 用例图(Use case diagram)
- 时序图(Sequence diagram)
- 协作图(Collaboration diagram)
- 状态图(Statechart diagram)
- 活动图(Activity diagram)
- 组件图(Component diagram)
- 部署图(Deployment diagram)
UML中的9种图
用例图
用例图描述角色以及角色与用例之间的连接关系。说明是谁要使用系统,以及他们使用该系统可以做些什么。一个用例图包含了多个模型元素,如系统、参与者和用例,并且显示了这些元素之间的各种关系,如泛化、关联和依赖。
用例图的组成
- 用例(use case): 表示驱动的业务目标
- 参与者(Actor): 整个建模的中心
- 业务工人(business worker): 系统中的被动参与者
案例如下:
活动图
描述用例要求所要进行的活动,以及活动间的约束关系,有利于识别并行活动。能够演示出系统中哪些地方存在功能,以及这些功能和系统中其他组件的功能如何共同满足前面使用用例图建模的商务需求。
活动图组成
- 起始点(Initial node)
- 边(Edge)
- 选择(Decision)
- 合并(Merge)
- 分支(Fork)
- 汇合(Join)
- 活动终止点(Activity final node)
案例如下:
类图
类图是描述系统中的类,以及各个类之间的关系的静态视图。能够让我们在正确编写代码以前对系统有一个全面的认识。类图是一种模型类型,确切地说,是一种静态模型类型。
类图表示类、接口和它们之间的协作关系。
例: Clock类的完整表示
属性表示
[可见性] 属性名[重数][‘:’类型][‘ =’初始值][{约束特征}]
可见性(访问控制性)分为+(公有)、#(受保护)或 -(私有)
操作表示:[可见性] 操作名[‘(‘参数列表’)’][‘:’返回类型] ][{约束特征}]
Clock类的简洁表示
对象图
对象图与类图极为相似,它是类图的实例,对象图显示类的多个对象实例,而不是实际的类。它描述的不是类之间的关系,而是对象之间的关系。
对象图是系统的详细状态在某一时刻的快照,常用于表示复杂的类图的一个实例。对象图实质上是具有关联关系的类图的实例。
类与对象之间关系图
类之间关系的强弱
依赖关系 (dependency)
... uses a ...
图中的“类A”是源,“类B”是目标,表示“类A”使用了“类B”,或称“类A”依赖“类B”
驾驶员和汽车之间的关系就是依赖关系
举个例子:
学生捡到钱交给警察叔叔,学生和警察叔叔就是一种依赖关系。因为学生捡到钱给警察是一种偶然的事情,交给警察后他们之间就没有关系了。我们在学生类中加入一个交钱的方法,在警察类中加入一个收钱的方法,当调用学生的交钱方法时,就调用警察的收钱方法。
关联关系(Association)
关联关系是一种比较强的关系,他们的关系是比较持久的,稳定的。比如学生从家里出来,学生和家就是一种关联关系。这种关系是比较稳定的。关联分单向关联和双向关联,如果一个类知道或者引用了另一个类,而另一个类不知道或者没有引用这个类,则这两个类是单向关联的。比如这里学生与家的关系就是单向关联的,因为每个学生都是有个家的,但不能说每个家里都有学生。单向关联我们用带箭头的实线表示,箭头指向被引用或者被包含的类,这里也就是家这个类。
示例如下:
双向关联是两个类彼此都知道对方的存在,比如老师与学生的关系就是双向的。小明的语文老师是张老师,张老师的学生有小明。双向关联用不带箭头的实线来连接两个类。
示例如下:
包含关系(inclusion)
包含关系有两种:聚合(aggregation)和组合(composition)
聚合关系(aggregation)
聚合关系是一种特殊的关联关系,聚合关系强调的是整体和部分的关系,其中部分可以脱离整体而存在。比如雁群和一只大雁的关系,就是聚合关系,大雁离开雁群还是可以独立存在的。再比如警察与制服的关系,制服也是警察的一部分,制服可以脱离警察而存在。在UML类图中聚合用带空心菱形的直线表示,其中菱形指向整体。
示例如下:
组合关系(composition)
组合关系也是一种特殊的关联关系,它与聚合关系很像,也是强调整体与部分的关系,不同的是部分无法脱离整体存在。比如学生用手捡钱,其中手就是学生的一部分,但是手不能脱离学生而单独存在。要是手能独立存在想想就可怕。这里我们称学生与手为组合关系,用带实心的菱形直线表示,其中菱形指向整体。
示例如下:
泛化关系
泛化关系在中也叫作继承关系,在UML中我们用带空心三角形的直线来表示,我们增加两个类,一个是Studen类,一个是警察Policemen类,两个类均继承自Person类,那么他们的类关系图表示如下:
实现关系
这里的实现关系就是类与接口的实现关系,在UML中我们用带空心三角形的虚线表示。由于Student和Policeman都职业,学生的职业就是学习,而警察的职业为保护人民。所有这里我们定义一个接口,里面有一个职业的方法:
这个接口用UML类图表示如下:
可以看到在接口名字上多了一个<>字符来表示这个为接口。接下来我们让Student和Policeman都实现这个接口,UML类图如下:
最后UML类图完成上面小学生捡钱的故事:
再举一个例子:
时序图
时序图又叫序列图,是用来显示参与者如何以一系列顺序的步骤与系统的对象交互的模型。顺序图可以用来展示对象之间是如何进行交互的。顺序图将显示的重点放在消息序列上,即强调消息是如何在对象之间被发送和接收的。
案例如下:
例子
状态图
状态图描述类的对象所有可能的状态,以及事件发生时状态的转移条件,可以捕获对象、子系统和系统的生命周期。它可以告知一个对象可以拥有的状态,并且事件(如消息的接收、时间的流逝、错误、条件变为真等)会怎么随着时间的推移来影响这些状态。
一个状态图应该连接到所有具有清晰的可标识状态和复杂行为的类;该图可以确定类的行为,以及该行为如何根据当前的状态变化,也可以展示哪些事件将会改变类的对象的状态。状态图是对类图的补充。
案例如下:
协作图
和序列图相似,显示对象间的动态合作关系。可以看成是类图和顺序图的交集,协作图建模对象或者角色,以及它们彼此之间是如何通信的。如果强调时间和顺序,则使用序列图;如果强调上下级关系,则选择协作图;这两种图合称为交互图。
案例如下:
组件图
组件图又叫构件图,描述代码构件的物理结构以及各种构建之间的依赖关系。用来建模软件的组件及其相互之间的关系,这些图由构件标记符和构件之间的关系构成。在组件图,构件时软件单个组成部分,它可以是一个文件,产品、可执行文件和脚本等。
软件组件之间的关系:
部署图
部署图又叫配置图,用来建模系统的物理部署。例如,计算机和设备,以及它们之间是如何连接的。部署图的使用者是开发人员、系统集成人员和测试人员。部署图用于表示一组物理结点的集合及结点间的相互关系,从而建立了系统物理层面的模型。
案例如下: