使用PlantUML绘制(重要)UML图

根据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

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *