PlantUML类图完全指南:语法详解与架构设计实践
PlantUML类图深度解析:从语法到架构设计实践
作为开发者最常用的UML工具之一,PlantUML通过简洁的文本描述就能生成专业图表。本文将重点剖析类图的核心语法元素,并通过架构设计案例展示其实际应用价值。
一、类定义与成员控制
类定义语法是PlantUML最基础也最核心的部分:
class BankAccount {
-balance: double = 0.0
+deposit(amount: double): boolean
#withdraw(amount: double): boolean
~getTransactionLog(): List<String>
}
可见性符号详解:
+
公有成员(任何类可访问)-
私有成员(仅本类可访问)#
保护成员(子类可访问)~
包内可见(同包类可访问)
实践建议:
- 优先使用
-
私有字段,通过公有方法控制访问 - 保护成员适合框架设计的扩展点
- 包级可见性在模块化设计中很有价值
二、接口与抽象类设计
面向对象设计的两大抽象工具:
abstract class PaymentProcessor {
{abstract} +validate(): boolean
+processPayment(): void
}
interface Loggable {
+logInfo(message: String): void
+logError(error: Throwable): void
}
class CreditCardProcessor {
+validate(): boolean
+processPayment(): void
}
PaymentProcessor <|-- CreditCardProcessor
Loggable <|.. CreditCardProcessor
关键区别:
- 接口(
interface
)代表能力契约,使用<|..
实现关系 - 抽象类(
abstract class
)提供部分实现,使用<|--
继承关系
架构启示:
- 接口更适合定义跨层次的能力契约
- 抽象类适合模板方法模式等场景
三、六大关系深度剖析
1. 继承关系(Generalization)
class Shape {
+draw(): void
}
class Circle {
+radius: double
}
Shape <|-- Circle
2. 实现关系(Realization)
interface Flyable {
+fly(): void
}
class Bird {
+fly(): void
}
Flyable <|.. Bird
3. 关联关系(Association)
class Professor {
-name: String
}
class Course {
-title: String
}
Professor "1" -- "many" Course : teaches >
4. 聚合关系(Aggregation)
class Department {
-name: String
}
class Professor {
-name: String
}
Department o-- Professor
5. 组合关系(Composition)
class Car {
-engine: Engine
}
class Engine {
-cylinders: int
}
Car *-- Engine
6. 依赖关系(Dependency)
class OrderService {
+placeOrder(): void
}
class EmailService {
+sendEmail(): void
}
OrderService ..> EmailService : uses >
关系选择指南:
关系类型 | 强度 | 生命周期 | UML符号 | 典型场景 | |
---|---|---|---|---|---|
继承 | 最强 | 一致 | < | -- | 父类与子类 |
实现 | 强 | 一致 | < | .. | 类与接口 |
组合 | 中 | 一致 | *-- | 整体与部分 | |
聚合 | 弱 | 独立 | o-- | 容器与内容 | |
关联 | 弱 | 独立 | -- | 长期持有 | |
依赖 | 最弱 | 临时 | ..> | 方法参数 |
四、高级建模技巧
1. 泛型与模板
class Repository<T> {
+save(entity: T): void
+findById(id: String): T
}
class User {
-username: String
}
Repository<User> --> User
2. 嵌套类与枚举
class Outer {
-inner: Inner
class Inner {
+doSomething(): void
}
}
enum Status {
ACTIVE
INACTIVE
PENDING
}
3. 注解与样式
@startuml
class Customer <<Entity>> #FFD700 {
+id: Long
+name: String
}
note left of Customer
重要领域模型
需要持久化存储
end note
@enduml
五、架构设计实战案例
微服务订单系统建模
@startuml
package "Order Service" {
class OrderController {
+createOrder(): Order
}
class OrderService {
-orderRepository: OrderRepository
+placeOrder(): Order
}
interface OrderRepository {
+save(): Order
}
OrderController --> OrderService
OrderService --> OrderRepository
}
package "Payment Service" {
class PaymentClient {
+processPayment(): boolean
}
}
OrderService ..> PaymentClient : calls
@enduml
架构要点:
- 清晰的服务边界划分
- 接口隔离的持久层设计
- 服务间弱依赖关系
常见问题解决方案
问题1:如何避免循环依赖?
class A {
-b: B
}
class B {
-a: A
}
' 解决方案:引入接口
interface I {
+operation(): void
}
A --> I
B ..> I
问题2:大型类图布局优化
@startuml
left to right direction
package "Domain" {
class EntityA
class EntityB
}
package "Infra" {
class RepositoryA
class RepositoryB
}
EntityA --> RepositoryA
EntityB --> RepositoryB
@enduml
PlantUML的强大之处在于能将复杂的架构设计可视化,同时保持代码库的同步更新。建议将PlantUML文件与源码一起纳入版本控制,使用构建工具自动生成图表,实现真正的"文档即代码"。
最佳实践:在架构设计评审前,先用PlantUML绘制关键类图,可以显著提升沟通效率。对于核心领域模型,建议每季度进行图文档与代码的一致性校验。
评论已关闭