2020年6月2日
文章标签
作为一个 Java 码农,写技术文档时,不可避免地需求描述类之间的关系。而 UML 经常用来描述类之间的关系。PlantUML 作为一种 UML 绘图工具,它的优势在于可以直接在 Markdown 中使用 。通过在 Markdown 中嵌入代码块,可以实现动态调整图形结构,避免修改图形结构、截图、贴图的繁琐步骤。本文记录下 PlantUML 的相关语法的同时,也梳理一下类之间的关系。
此外,C4-PlantUML 的目的是美化PlantUml和C4 Model所绘制系统架构图的样式,统一审美而产生的一个 UML 绘制语法。下面样例中,C4-PlantUML 与普通 PlantUML 语法差别仅在 C4-PlantUM 会引入 !include C4_Context.puml
一句。
如下代码块的内容,都可以通过相关工具进行测试。同时,示例中的图都是通过 Kroki! 渲染的。
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
Java 类元素之间的关系有 6 种,按照相关性从强到弱,分为:继承、实现、组合、聚合、关联、依赖
继承是面向对象最显著的一个特征。它表示扩展“现有类”的能力,除了包含父类的部分属性和行为,还可以增加自己特有的属性和行为。例如,定义父类: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中,继承用带三角箭头的实线表示,箭头从子类指向父类。