背景
类图是UML模型中的静态视图,其主要作用包括:
- 描述系统的结构化设计,显示出类、接口以及它们之间的静态结构和关系。
- 简化对系统的理解,是系统分析与设计阶段的重要产物,也是系统编码和测试的重要模型依据。
在UML中,一个类通常由名称、属性和操作等构成,除此之外,类的构成还包含类的职责、约束和注释等信息。
使用
创建plantUML文件
在PlantUML中,要创建类图,首先我们要创建一个plantUML文件,选择class类型
创建完成后,会自动生成一个模板文件供我们参考。
类的定义
在UML的类图中,一般我们需要表示出一个类各个字段的可见性,UML中可见性和符号的对应关系如下:
可见性 | 符号 |
---|---|
public | + |
package private | ~ |
protected | # |
private | - |
在Java中,类用class关键字、接口使用interface关键字,而抽象类使用abstract class,枚举类使用enum。在PlantUML中,我们同样可用用class、interface、abstract class和enum来分别表示出类、接口、抽象类和枚举。
如下图所示,我们定义了Person类,其中Person类有id、name、birthday属性,并且它们的可见性为private,此外,含有getId、getName和getBirthday这些public方法。然后还定义了Car接口和List抽象类,最后定义了一个Size枚举类,这个枚举类包含SMALL、MEDIUM、LARGE和EXTRA_LARGE这些实例。
@startuml
class Person {
- id
- name
- birthday
+ getId()
+ getName()
+ getBirthday()
}
interface Car
abstract class List
enum Size{
SMALL
MEIDUM
LARGE
EXTRA_LARGE
}
@enduml
类型关系
在UML中,类与类之间,包含以下6种关系:
关系 | plantUML表示 | 描述 |
---|---|---|
泛化(Generalization) | – | > |
实现(Realization) | … | > |
关联(Association) | –> | 关联关系表示“拥有”,相比依赖关系的临时性和单向性,关联关系具有长期性、平等性(可双向),所以关联表示的关系比依赖更强。 |
聚合(Aggregation) | –o | 聚合关系相对组合弱一些,在聚合关系中,整体与部分是可分离的,比如学校和学生,一个学校有多个学生,当学生毕业后,学校仍然存在,不受影响,而学生实体也不会因为离开学校而被销毁。 |
组合(Composition) | –* | 在组合关系中,整体与部分是不可分离的,整体与部分的生命周期保持一致,比如人体和四肢,就是一种典型的组合关系。 |
依赖(Dependency) | …> | 依赖表示使用关系,在java中,被依赖的类,一般以方法参数、局部变量和静态方法调用等形式出现 |
以下图为例,Student继承于Person类,然后Student的study方法中,会以Book作为参数,因此,Student和Book之间是依赖关系。然后List接口有两个实现——AbstractList和AbstractLinkedList,因此,它们之间是实现关系,而ArrayList继承自AbstractList,因此它们之间是泛化关系。最后,一个学校有多个学生,学校和学生之间是聚合关系。
@startuml
class Person {
- id
- name
- birthday
+ getId()
+ getName()
+ getBirthday()
}
class Student {
- grade
+ getGrade()
+ study(Book book)
}
class Book {
}
Person <|-- Student
Student ..> Book
interface List
abstract class AbstractList
abstract class AbstractLinkedList
AbstractList ..|> List
AbstractLinkedList ..|> List
class ArrayList
class LinkedList
ArrayList --|> AbstractList
LinkedList --|> AbstractLinkedList
class School {
- List<Student> student
}
Student --o School
@enduml
箭头方向
在上面的类图中,我们发现这个箭头方向有时候指向上面,有时候指向下面,当我们需要对箭头方向进行调整时,
可以使用up、down、left和right来表示。以下代码为例,表示School的上面是Person,School的右边是School
Student -up-|> Person
Student -right-o School
@startuml
class Person {
- id
- name
- birthday
+ getId()
+ getName()
+ getBirthday()
}
class Student {
- grade
+ getGrade()
+ study(Book book)
}
class Book {
}
Student -up-|> Person
Student .left.> Book
interface List
abstract class AbstractList
abstract class AbstractLinkedList
AbstractList .up.|> List
AbstractLinkedList .up.|> List
class ArrayList
class LinkedList
ArrayList -up-|> AbstractList
LinkedList -up-|> AbstractLinkedList
class School {
- List<Student> student
}
Student -right-o School
@enduml
颜色
在PlantUML中,我们可以对相关的元素去设置对应的颜色,其语法也很简单,就是在类的声明后面,加上颜色的定义,比如说我们想设置Person为红色,Student为绿色,那么定义如下:
class Person #red {
- id
- name
- birthday
+ getId()
+ getName()
+ getBirthday()
}
class Student #green {
- grade
+ getGrade()
+ study(Book book)
}
对于类与类之间的连线,同样可以设置对应的颜色,比如我们希望类与类之间颜色为蓝色,那么可以在右边加上对应的颜色定义,示例如下:
Student -up-|> Person #blue
Student .left.> Book #blue
@startuml
class Person #red {
- id
- name
- birthday
+ getId()
+ getName()
+ getBirthday()
}
class Student #green {
- grade
+ getGrade()
+ study(Book book)
}
class Book #6ACCEF {
}
Student -up-|> Person #blue
Student .left.> Book #blue
interface List #6ACCEF
abstract class AbstractList #6ACCEF
abstract class AbstractLinkedList #6ACCEF
AbstractList .up.|> List #blue
AbstractLinkedList .up.|> List #blue
class ArrayList #6ACCEF
class LinkedList #6ACCEF
ArrayList -up-|> AbstractList #blue
LinkedList -up-|> AbstractLinkedList #blue
class School #6ACCEF{
- List<Student> student
}
Student -right-o School #blue
@enduml
包图
在我们的类图中,有时候这些类散落在不同的包下,因此,我们需要定义包图,来反映这些类归属于哪些包和这些包之间的依赖关系,包的声明很简单,使用package关键字接口,示例如下:
package com.yang {
}
声明包之后,我们将类的定义,写在对应的包代码块下,以表示这个类归属于当前包。
@startuml
package com.yang.model #orange{
class Person #red {
- id
- name
- birthday
+ getId()
+ getName()
+ getBirthday()
}
class Student #green {
- grade
+ getGrade()
+ study(Book book)
}
}
package com.yang.valueobject #grey{
class Book #6ACCEF {
}
class School #6ACCEF{
- List<Student> student
}
}
package java.util {
interface List #6ACCEF
abstract class AbstractList #6ACCEF
abstract class AbstractLinkedList #6ACCEF
class ArrayList #6ACCEF
class LinkedList #6ACCEF
}
Student -up-|> Person #blue
Student .left.> Book #blue
AbstractList .up.|> List #blue
AbstractLinkedList .up.|> List #blue
ArrayList -up-|> AbstractList #blue
LinkedList -up-|> AbstractLinkedList #blue
Student -right-o School #blue
@enduml
参考文档
https://blog.csdn.net/zhangwei_david/article/details/125477021
https://blog.csdn.net/vitaviva/article/details/120639074
https://www.cnblogs.com/lanqiu5ge/p/9502419.html