统一建模语言(Unified Modeling Language,缩写UML)是非专利的第三代建模和规约语言。 UML是一种开放的方法,用于说明、可视化、构建和编写一个正在开发的、面向对象的、软件密集系统的制品的开放方法。
简介
UML分为模型和图形两大类。区分UML模型和UML图是非常重要的,UML图(包括用例图、协作图、活动图、序列图、部署图、构件图、类图、状态图)是模型中信息的图表表达形式,但是UML模型独立于UML图存在。
核心模型
在UML系统开发中有三个主要的模型:
- 功能模型:从用户的角度展示系统的功能,包括用例图。
- 对象模型:采用对象,属性,操作,关联等概念展示系统的结构和基础,包括类别图、对象图。
- 动态模型:展现系统的内部行为。包括序列图,活动图,状态图。
图示
UML2.2中一共定义了14种图示。
- 结构性图形(Structure diagrams)强调的是系统式的建模:
- 静态图(static diagram):包括类图、对象图、包图
- 实现图(implementation diagram):包括组件图、部署图
- 剖面图
- 复合结构图
- 行为式图形(Behavior diagrams)强调系统模型中触发的事件
- 活动图
- 状态图
- 用例图
- 交互性图形(Interaction diagrams),属于行为图形的子集合,强调系统模型中的资料流程
- 通信图
- 交互概述图
- 时序图
- 时间图
UML类图作用
UML展现了一系列最佳工程实践,这些最佳实践在对大规模,复杂系统进行建模方面,特别是软件架构层次方面已经被验证有效。 我们这次介绍的主要是类图,为了解析项目的系统结构和架构层次,可以简洁明了的帮助我们理解项目中类之间的关系。 类图的作用: (1):在软件工程中,类图是一种静态的结构图,描述了系统的类的集合,类的属性和类之间的关系,可以简化了人们对系统的理解; (2):类图是系统分析和设计阶段的重要产物,是系统编码和测试的重要模型。
类图格式
在UML类图中,类使用包含类名、属性(field) 和方法(method) 且带有分割线的矩形来表示, 举个栗子。一个Animal类,它包含name, age, state, isPet 这4个属性,以及name相关方法。
代码语言:javascript复制class Animal: NSObject {
public var name: String?
internal var isPet: Bool?
fileprivate var state: String?
private var age: Int? = 0
override init() {
self.name = "no name"
self.age = 0
self.isPet = true
self.state = "dead"
}
public func getName() -> String {
return self.name!
}
internal func setName(name: String?) {
self.name = name
}
}
类图基础属性
代码语言:javascript复制 表示 public
-表示 private
#表示 protected
~表示 default,也就是包权限
_下划线表示 static
斜体表示抽象
类图中的元素及解释
类
- 从上到下分为三部分,分别是类名、属性和操作。类名是必须有的
- 类如果有属性,则每一个属性必须有一个名字,另外还可以有其他的描述信息,如可见性、数据类型、缺省值等
- 类如果有操作,则每一个操作也都有一个名字,其他可选的信息包括可见性、参数的名、参数类型、参数缺省值和操作的返回值的类型等
接口
一组操作的集合,只有操作的声明而没有实现
抽象类
不能被实例化的类,一般至少包含一个抽象操作
模板类
一种参数化的类,在编译时把模板参数绑定到不同的数据类型,从而产生不同的类
类与类之间关系
- 在UML类图中,常见的有以下几种关系:
- 泛化(Generalization)
- 实现(Realization)
- 关联(Association)
- 聚合(Aggregation)
- 组合(Composition)
- 依赖(Dependency)
泛化
泛化(Generalization)表示类与类之间的继承关系,接口与接口之间的继承关系,或类对接口的实现关系
介绍: 继承表示是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力。
表示方法:继承使用空心三角形 实线表示,箭头指向父类
示例: 鸟类继承抽象类动物
实现
实现表示一个class类实现 interface 接口(可以是多个)的功能。
表示方法:
1)矩形表示法
使用空心三角形 虚线表示,箭头指向接口类
比如:大雁需要飞行,就要实现
飞()
接口
2)棒棒糖表示法
使用实线表示
依赖
对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。通常代码表现为方法参数,局部变量,静态方法调用,util类调用。
表示方法: 依赖关系用虚线箭头表示,从依赖方指向被依赖的类
示例: 动物依赖氧气和水。调用新陈代谢方法需要氧气类与水类的实例作为参数
关联
单向关联
对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时,这两个对象之间为关联关系。
表示方法: 关联关系用实线箭头表示。
**示例:**企鹅需要‘知道’气候的变化,需要‘了解’气候规律。当一个类‘知道’另一个类时,可以用关联。
双向关联
对于双向关联来说被关联的两个类可以感知对方的存在
表示方法如下:
表示 | 含义 |
---|---|
0…1 | 0个或1个 |
1 | 只能1个 |
0…* | 0个或多个 |
* | 0个或多个 |
1…* | 1个或多个 |
3 | 只能3个 |
0…5 | 0到5个 |
5…15 | 5到15个 |
聚合
聚合是关联关系的一种,聚合主要描述整体与部分直接的关系。需求陈述中常使用“包含”、“组成”、“分为…部分”等字句。表示一种弱的‘拥有’关系,即has-a的关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分。 两个对象具有各自的生命周期。除了基本(一般)聚集之外,还有共享聚集和组合聚集。
- 在聚合关系中,成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立存在
表示方法:聚合关系用空心的菱形 实线箭头表示。
**示例:**每一只大雁都属于一个大雁群,一个大雁群可以有多只大雁。当大雁死去后大雁群并不会消失,两个对象生命周期不同。
组合
组合聚合是聚合的一种特殊情况,是一种强的‘拥有’关系,是一种contains-a的关系,体现了严格的部分和整体关系,成员对象与整体对象之间具有同生共死的关系,部分和整体的生命周期一样。
表示方法: 组合关系用实心的菱形 实线箭头表示,还可以使用连线两端的数字表示某一端有几个实例。
**示例:**鸟和翅膀就是组合关系,因为它们是部分和整体的关系,并且翅膀和鸟的生命周期是相同的。
模型图示例
参考资料
- https://www.jianshu.com/p/57620b762160
- https://juejin.cn/post/6844903893327937550#heading-1
- https://zhuanlan.zhihu.com/p/456759825