根据Martin Fowler在《UML精粹》中的表述,UML中的重要图形可以解决80%的问题:
- 类图(包图)
- 序列图(顺序图)
- 部署图
- 用例图
- 状态机图
本文将介绍PlantUML中,如何绘制上述重要的UML图。
1 类图(class)
几个重点表示:
- 类:属性和方法
- 关联:实线箭头(单向或双向),n表示0~n,1,0..1等
- 聚合:实线箭头,空心棱形,可拆分
- 组合:实线箭头,实心棱形,不可拆分
- 泛化:实线箭头,空心三角
- 实现接口:棒棒糖
- 约束:{约束}
代码:
@startuml class Order { long timestamp double totalPrice() } class OrderItem { long productId doubel price } class Address { String country String address long zipCode boolean valid() } class User { String name } ' 星对1 Order "*" <-right-> "1" User : 双向关联 ' 包含,约束 Order "1" -up-> "1" Address : {约束,必须是合法地址} ' 1对多,关系标签 Order "1" o-left- "n" OrderItem : 聚合 ' 棒棒糖表示法,实现接口 ClassImpl -() IntfaceX ' 聚合 & Note Human *-down- Heart : 组合 ' 注释 note bottom of Heart 心脏是人的一部分,不可拆 end note ' 组合 ' 泛化、包 package "Car的泛化包" { Car <|-- SUV Car <|-- Sedan Car <|-- Van } ' 依赖 Consumer ..|> Producer : 依赖 ' 定位排版 Human -[hidden]up-> Order Consumer -[hidden]right-> Human Car的泛化包 -[hidden]left-> Human @enduml
最终图:
更多PlantUML的类图用法,可以参考官方class文档
2 顺序图(sequence)
重要的:
- 参与者:Actor,其他类
- 调用:实现
- 返回:虚线
- 激活:竖箱,代表生命周期
- 分组:用框图圈起来
- 循环:可以用上述分组做为子组,或者在线上表示
代码:
@startuml Actor User User --> Order : calculatePrice activate Order alt '计算订单价格' Order -> OrderItem : ✳️ [for each item ] loop 'each item' OrderItem -> Product : getPrice Product --> OrderItem : price end OrderItem --> Order : priceList Order -> Discount : calculateCoupon activate Discount Discount --> Order : discountInfo end Order -> User : price @enduml
最终图:
3 部署图
关键组件:
节点:一个物理的进程 / 容器 / 机器
@startuml node Browser [ Browser ---- OS = Windows / Linux / MacOS Browser = Chrome / Firefox / Edge ==== Client Process ] node WebServer [ Web Server ---- OS = Linux Type = Nginx Version = 1.2+ ==== Server Process ] node ApplicationServer [ Application Server ---- Framework: Spring Boot Version: 2.5 ==== app.jar ] database Database [ Database ---- OS = Linux Type = MySQL Version = 5.7 ==== Server Process ] Browser -> WebServer WebServer -down-> ApplicationServer ApplicationServer -left-> Database @enduml
最终图:
也可以是物理部署的连接图
@startuml node 客户端 { agent agent0[ <<artifact>> KaoQing.exe ] } node 服务器 { agent agent1[ <<artifact>> KpServer.exe ] agent agent2[ <<artifact>> CradReader.exe ] agent agent3[ <<database>> KaoQing.exe ] } node IC卡读卡器 #palegreen;line:green;line.dashed;text:green [ IC卡读卡器 {number = 3} ] 服务器 -- 客户端 : {100M以太网} 服务器 --- IC卡读卡器 : {RS-232C} agent1 ..> agent3 agent1 --> agent2 @enduml
4 用例图
@startuml left to right direction actor Guest as g package Professional { actor Chef as c actor "Food Critic" as fc } package Restaurant { usecase "Eat Food" as UC1 usecase "Pay for Food" as UC2 usecase "Drink" as UC3 usecase "Review" as UC4 } fc --> UC4 g --> UC1 g --> UC2 g --> UC3 @enduml
5 思维导图
@startmindmap <style> mindmapDiagram { node { BackgroundColor lightGreen } boxless { FontColor darkgreen } } </style> * Linux ** NixOS ** Debian ***_ Ubuntu **** Linux Mint **** Kubuntu **** Lubuntu **** KDE Neon @endmindmap