# 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中一个表示类的符号包括以下部分,其中有类名,属性,方法组成。

from https://www.visual-paradigm.com/guide/uml-unified-modeling-language/uml-class-diagram-tutorial/ (opens new window)

我们知道在面向对象中每个类的属性和方法的访问控制分成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 AnimalDog is a Animal
  • 抽象类名以斜体显示。

下图显示了继承层次结构的示例,SubClass1SubClass2继承自SuperClass

---
title: Generalization example
---
classDiagram 
    SuperClass --|> SubClass1
    SuperClass --|> SubClass2

六种关系中,从弱到强依次是:依赖关系 < 关联关系 < 聚合关系 < 组合关系 < 实现关系 = 泛化关系。

# 常用的UML工具

  • mermaid,支持在Markdown文档中使用,支持在线使用,在线预览 (opens new window)
  • umbrello,ubuntu下的免费uml工具,使用其画出的类图是这样的

  • PowerDesigner,德国思爱普(SAP)公司开发的付费软件,功能强大,可用于数据库模型设计等

# reference