# UML面向对象类图和关系
# 4种静态结构图
UML中的的图表分成两类,结构图和行为图。行为图描述的是系统的动态特性,结构图描述了建模时系统的静态特性。结构图中提供了4种静态结构图来描述系统。其中,类图(Class Diagram)是软件的蓝图,用于详细描述系统内各个对象的相关类,以及这些类之间的静态关系;对象图(Object Diagram)用于表示在某一时刻,类的对象的静态结构和行为;包图(Package Diagram)用于展现由模型本身分解而成的组织单元(包)及它们的依赖关系;组合结构图(Composite Structure Diagram)用于描述系统中某一部分(组合结构)的内部结构,包括该部分与系统其他部分的交互点。
静态结构图的推荐使用场合:包括业务建模、分析、设计、实现等场合。
# 类图
在面向对象语言中,在做系统代码设计时,经常看到有用UML类图去表示各种接口和类之间关系的。但是,每次看的都是云里雾里,搞不清楚那些虚线,箭头都是代表什么意思。现在我们一起来看下。
从上面的表中也能看到UML
类图中有6
种关系,分别是依赖(Dependency)/关联(Association)/聚合(Aggregation)/组合(Composition)/泛化(Generalization)/实现/(Realization)
classDiagram
classA --|> classB : Inheritance
classC --* classD : Composition
classE --o classF : Aggregation
classG --> classH : Association
classI -- classJ : Link(Solid)
classK ..> classL : Dependency
classM ..|> classN : Realization
classO .. classP : Link(Dashed)
# 类的表示
UML中一个表示类的符号包括以下部分,其中有类名,属性,方法组成。
我们知道在面向对象中每个类的属性和方法的访问控制分成private/protected/public
,这在类图中分别使用不同的符号来表示。
符号 | 访问权限 |
---|---|
+ | public |
# | protected |
- | private |
~ | package |
从类图的完整程度可以分成三种类图,
- 概念型(Conceptual),在系统中表示的是这个类,还没有设计属性和方法,属于最早期的设计。
- 具体型(Specification),关注的是抽象数据类型的接口
- 实现型(Implementation),描述了类如何实现其接口,确定函数的签名等。
from [https://www.visual-paradigm.com/guide/uml-unified-modeling-language/uml-class-diagram-tutorial/]
# 类与类之间的关系
# 依赖关系(Dependency)
依赖关系的表示的是一种使用关系,考虑一个类的对象的方法中使用了另一个类的对象,作为函数参数或方法的局部变量,这时就是依赖关系。
如下图,Person
类中有个readBook
方法,依赖Book
类。
---
title: Dependency example
---
classDiagram
Book <.. Person
class Person{
-int age
-String name
+void ReadBook(Book b)
}
class Book{
-int isbn
-String name
+String getName()
}
# 关联关系(Association)
关联关系表示的是对象之间的引用关系,其对应到现实世界中通常是动词连接的两个主体类别之间的关系,像老师教学生,学生选择课程。同时还要注意,关联关系还分成一对多,多对一,一对一,同时还区分类与类之间是单向关联还是双向关联。
如学生和老师,一个学生可以有多个老师,一个老师也可以有多个学生,因此是双向关联。而对于课程来说,只是开放出来供学生选择,只有学生选择课程的关系,是单向关联。
双向关联使用实线连接,单向关联使用实线单箭头连接关联类和被关联类,箭头指向被关联类。
---
title: Association example
---
classDiagram
Teacher -- Student
Student --> Course
class Teacher{
-List<Student> students
+void teach()
}
class Student{
-List<Teacher> teachers
-List<Course> courses
+void study()
}
class Course{
-String name
+String outline()
}
# 聚合(Aggregation)
聚合是一种特殊的关联关系。其表示的是部分和整体的关系,一个类是另一个类的一部分,两个类有单独的生命周期,可以分离存在。
聚合关系在类中是通过成员对象来体现的,成员是整体的一部分,成员也可以脱离整体而存在。如公司与职员,汽车与车轮。
---
title: Aggregation example
---
classDiagram
Company o-- Employee
class Company{
-List<Employee> employees
+void salary()
}
class Employee{
-String name
+void work()
}
# 组合(Composition)
组合是一种比聚合更强的关联关系,聚合中整体和个体可以分别单独存在,但在组合关系中表示的是个体无法脱离整体存在。
整体被破坏掉时,个体也将被破坏掉。个体与整体同生共死,个体无法独立存在。
譬如,文件夹可以包含许多文件,而每个文件只有一个文件夹父级。如果删除文件夹,所有包含的文件也会被删除。
---
title: Composition example
---
classDiagram
Folder *-- File
class Folder{
-List<File> files
+void find()
}
class File{
-String name
+void read()
}
# 实现(Realization)
实现是蓝图类和包含其各自实现级别细节的对象之间的关系。实现关系就是接口和实现类之间的关系。类实现了接口中的抽象方法。特别是在JAVA
这种语言中,接口类与实现类是分开的。
在接口类中指定行为,在实现类中实现或定义该行为。
从下图可以看出,AccountBusinessRule
类实现了接口IRuleAgent
。
---
title: Realization example
---
classDiagram
IRuleAgent ..|> AccountBussinessRule
class IRuleAgent{
+void addRule()
+void changeRule()
+void explainAction()
}
# 继承/泛化(Inheritance/Generalization)
泛化是一般的类和更具体的类之间的关系。泛化其实就是父子类之间的继承关系,表示一般与特殊的关系,指定子类如何特殊化父类的特征和行为。这是六种关系中相关性最强的关系。
- 表示的
是一个is-a
的关系,如Animal
类和Bird
类和Dog
类,Bird is a Animal
,Dog is a Animal
。 - 抽象类名以斜体显示。
下图显示了继承层次结构的示例,SubClass1
和SubClass2
继承自SuperClass
。
---
title: Generalization example
---
classDiagram
SuperClass --|> SubClass1
SuperClass --|> SubClass2
六种关系中,从弱到强依次是:依赖关系 < 关联关系 < 聚合关系 < 组合关系 < 实现关系 = 泛化关系。
# 常用的UML工具
mermaid
,支持在Markdown
文档中使用,支持在线使用,在线预览 (opens new window)umbrello
,ubuntu
下的免费uml
工具,使用其画出的类图是这样的
PowerDesigner
,德国思爱普(SAP)公司开发的付费软件,功能强大,可用于数据库模型设计等