PlantUML——类图

背景

类图是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这些实例。

python 复制代码
@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,因此它们之间是泛化关系。最后,一个学校有多个学生,学校和学生之间是聚合关系。

python 复制代码
@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

python 复制代码
Student -up-|> Person
Student -right-o School
python 复制代码
@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为绿色,那么定义如下:

python 复制代码
class Person #red {
	- id
	- name
	- birthday
	+ getId()
	+ getName()
	+ getBirthday()
}

class Student #green {
	- grade
	+ getGrade()
	+ study(Book book)
}

对于类与类之间的连线,同样可以设置对应的颜色,比如我们希望类与类之间颜色为蓝色,那么可以在右边加上对应的颜色定义,示例如下:

python 复制代码
Student -up-|> Person #blue
Student .left.> Book #blue
python 复制代码
@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关键字接口,示例如下:

python 复制代码
package com.yang {
}

声明包之后,我们将类的定义,写在对应的包代码块下,以表示这个类归属于当前包。

python 复制代码
@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

相关推荐
战神刘玉栋1 小时前
《知识拓展 · 统一建模语言UML》
软考·uml·面向对象
喵~来学编程啦5 小时前
【软件工程】一篇入门UML建模图(状态图、活动图、构件图、部署图)
软件工程·uml
喵~来学编程啦10 小时前
【软件工程】一篇入门UML建模图(用例图、对象图、顺序图与协作图)
软件工程·uml
肖老师+3 天前
可视化建模以及UML期末复习篇----UML图
uml·可视化建模
huaqianzkh4 天前
UML箭线图的理解和实践
uml
编程老船长5 天前
第2章 系统设计实战指南:角色定义、功能模块与接口分析
后端·uml·设计
rolt10 天前
[pdf,epub]228页《分析模式》漫谈合集01-45提供下载
ddd·架构师·uml·领域驱动设计·面向对象
思忖小下10 天前
开发中使用UML的流程_07 PIM-3:定义静态结构
uml·静态结构
思忖小下12 天前
开发中使用UML的流程_05 PIM-1:分析系统流程
uml·分析系统流程