IDEA生成UML类图(PlantUML)

1,035 阅读3分钟

前言

统一建模语言(UML)相信大家都不陌生,在软件工程的各个阶段均有应用。其中,类图是在详细设计阶段,经常要使用到的一种图。

画类图的工具有很多,专用的绘制软件有Visio。Visio的功能比较强大,不仅仅是软件方面的绘图,其他的流程图、房屋平面图、网络设备架构图等,Visio都可以胜任。但大家在绘制UML的时候,可能更倾向于一些轻量级的软件,例如MindMaster、ProcessOn等。而且一般公司的Wiki平台,也会提供一些绘制UML的功能。

除此以外,在专业版IDEA中还有Diagrams这个功能。Diagrams应该是大家分析代码设计模式的大杀器,因为他可以自动生成类图。Diagrams生成类图虽然快速,但我们无法对其进行修改调整。并且只能绘制类图,不支持其他类型的图。

这里介绍IDEA一个绘制UML的插件——PlantUML。PlantUML是一门描述UML的语言,可以用代码的方式生成想要的UML图。总的来看,这门语言并不复杂,官网(PlantUML)提供了详细的案例,可以在20分钟左右的时间内掌握特定图的编写。让你有种使用Markdown来绘制UML的感觉,相信某些人会喜欢的

下面简单介绍IDEA中PlantUML的安装,以及简单的使用案例。

安装

安装IDEA插件

在Plugins中查找PlantUML,安装如下两个插件:

  1. PlantUML Integration:PlantUML绘图工具集成。
  2. PlantUML Parser:Java源代码转PlantUML解析器。
    在这里插入图片描述

安装Graphviz

Graphviz是由AT&T实验室启动的开源工具包,用于绘制DOT语言脚本描述的图形。PlantUML需要依赖Graphviz中的工具包。

Mac OS可用Homebrew安装:

brew install graphviz

使用

选择

在工程中新建PlantUML File。
在这里插入图片描述
选择图类型。
在这里插入图片描述

绘制

新建的文件都会给出Demo,并给出了官网链接,现在就可以开始绘图了。
在这里插入图片描述

保存

可输出为png图片格式。
在这里插入图片描述

案例

使用
在这里插入图片描述
类图
在这里插入图片描述

配置文件

@startuml

Observable ..> Cycle
ObservableThread ..> TaskLifeCycle
ObservableThread ..> Task
TaskLifeCycle ..> Thread

enum Cycle{
    STARTED
    RUNNING
    DONE
    ERROR
}
note left of Cycle:任务的生命周期枚举

interface Observable
{
    + Cycle getCycle()
    + void start()
    + void interrupt()
}
note left of Observable:定义可观测性

interface TaskLifeCycle{
    + void onStart(Thread thread)
    + void onRunning(Thread thread)
    + void onFinish(Thread thread,T result)
    + void onError(Thread thread,Exception e)
}
note left of TaskLifeCycle:定义任务执行的生命周期中\n会被触发的方法

class EmptyLifecycle implements TaskLifeCycle{
        + void onStart(Thread thread)
        + void onRunning(Thread thread)
        + void onFinish(Thread thread,T result)
        + void onError(Thread thread,Exception e)
}
note left of EmptyLifecycle:TaskLifeCycle的默认实现。

class Thread{
    + void run()
}

interface Task{
    + T call()
}
note right of Task:Runnable类不具备可观测性,\n这里使用Task类代替

class ObservableThread extends Thread implements Observable{
    - TaskLifeCycle<T> lifeCycle
    - Task<T> task
    - Cycle cycle

    + ObservableThread(Task<T> task)
    + ObservableThread(TaskLifeCycle<T> lifeCycle, Task<T> task)
    + void run()
    + Cycle getCycle()
}
note left of ObservableThread:实现任务监控的关键\n继承Thread,实现TaskLifeCycle接口

@enduml

最后

PlantUML并不一定适合所有人,全看个人喜好。就像UML的格式就有很多种,本身UML也是个可选项。一切都服务于需求,我们应该根据不同的需求选择合适的工具。