2020年6月2日

文章标签

IT技能点

作为一个 Java 码农,写技术文档时,不可避免地需求描述类之间的关系。而 UML 经常用来描述类之间的关系。PlantUML 作为一种 UML 绘图工具,它的优势在于可以直接在 Markdown 中使用 。通过在 Markdown 中嵌入代码块,可以实现动态调整图形结构,避免修改图形结构、截图、贴图的繁琐步骤。本文记录下 PlantUML 的相关语法的同时,也梳理一下类之间的关系。

此外,C4-PlantUML 的目的是美化PlantUml和C4 Model所绘制系统架构图的样式,统一审美而产生的一个 UML 绘制语法。下面样例中,C4-PlantUML 与普通 PlantUML 语法差别仅在 C4-PlantUM 会引入 !include C4_Context.puml 一句。

如下代码块的内容,都可以通过相关工具进行测试。同时,示例中的图都是通过 Kroki! 渲染的。

1. 基本元素(类型)声明

PlantUML 支持 Java 中常用的类型,包括抽象类、接口、类、实例、枚举、注解;除此以外,还额外支持通用的图形,比如圆形、菱形。

如下所示,PlantUML 的代码块以 @startuml 开头,以 @enduml 结尾。各元素的声明方式如下所示

@startuml
!include C4_Context.puml

abstract        抽象
abstract class  抽象(等同abstract)
annotation      注解
circle          圆
()              圆缩写形式
class           类
diamond         菱形
<>              菱形写形式
entity          实例
enum            枚举
interface       接口

@enduml

同时,hide circle 语法可以隐藏所有元素的原型图标提示,以上图为例

@startuml
!include C4_Context.puml

hide circle

abstract        抽象
abstract class  抽象(等同abstract)
annotation      注解
circle          圆
()              圆缩写形式
class           类
diamond         菱形
<>              菱形写形式
entity          实例
enum            枚举
interface       接口

@enduml

2. 类之间的关系

Java 类元素之间的关系有 6 种,按照相关性从强到弱,分为:继承、实现、组合、聚合、关联、依赖

2.1. 继承

继承是面向对象最显著的一个特征。它表示扩展“现有类”的能力,除了包含父类的部分属性和行为,还可以增加自己特有的属性和行为。例如,定义父类:Person(包含“名字”、“年龄”属性),在此继承上,可以扩展 Student 类(增加“学号”属性)。

继承是语义是 “is-a” 的关系,常见的场景例如:父与子、植物与树等

package com.xyz;

public class Person {
    /**
     * 名字
     */
    private String name;
    /**
     * 年龄
     */
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
package com.xyz;

public class Student extends Person {
    /**
     * 学号
     */
    private String studentID;

    public String getStudentID() {
        return studentID;
    }

    public void setStudentID(String studentID) {
        this.studentID = studentID;
    }
}

在UML中,继承用带三角箭头的实线表示,箭头从子类指向父类。