自学内容网 自学内容网

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

@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


原文地址:https://blog.csdn.net/weixin_55850954/article/details/144308165

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!