PlantUML组件间连接方式详解

组件图是描述软件架构的重要工具,而组件间的连接方式则是组件间交互关系的可视化表达。本文将深入讲解PlantUML中四种核心连接方式及其应用场景。

1. 依赖关系(Dependency)的箭头样式

依赖关系是最基础的连接类型,表示一个组件在某种方式上依赖于另一个组件。

语法示例

@startuml
[订单服务] --> [支付服务] : 调用支付API
[库存服务] ..> [数据库] : 数据持久化
@enduml

箭头样式说明

  • --> 实线箭头:强依赖关系(编译期依赖)
  • ..> 虚线箭头:弱依赖关系(运行时动态依赖)
  • -- 无箭头实线:双向依赖(应尽量避免)
  • .. 无箭头虚线:临时性关联

实践建议

  1. 避免循环依赖,可使用!include拆分复杂组件
  2. 对关键依赖添加注释说明协议类型(如REST/gRPC)
  3. 使用颜色标记不同环境依赖(如测试环境用黄色)
@startuml
skinparam component {
    BackgroundColor TestEnv<<Test>> #FFFACD
}

[客户端] -[#red]-> [API网关] <<Production>>
[测试工具] -[#008000]-> [API网关] <<Test>>
@enduml

2. 提供/使用接口(Provides/Requires)连接

这种连接方式明确表示组件间的接口契约,比普通依赖更规范。

显式接口示例

@startuml
interface "支付接口" as Payment {
    + processPayment()
}

[订单服务] ..|> Payment
[支付服务] ..|> Payment
@enduml

隐式接口示例

@startuml
component [订单服务] {
    [提供接口] .. UP : 订单查询
    [需要接口] .. DOWN : 支付服务
}

component [支付服务] {
    [提供接口] .. UP : 支付服务
}

[订单服务] DOWN -- [支付服务] UP
@enduml

最佳实践

  1. 关键业务接口建议使用显式定义
  2. 简单内部接口可用隐式表示减少图形复杂度
  3. 接口命名应遵循<动作><资源>模式(如getUserInfo

3. 组装连接器(Assembly Connector)

用于展示组件内部部件如何通过接口连接,适合复杂组件内部设计。

典型用法

@startuml
component "订单系统" {
    component "订单处理器" as Processor
    component "验证服务" as Validator
    
    Processor -- Validator : 验证请求
    Validator -- Processor : 验证结果
}

[Web前端] --> Processor : 提交订单
@enduml

高级技巧

  1. 使用()表示内部连接点:

    component A {
     (输入端口)
     (输出端口)
    }
  2. 嵌套组件连接:

    component A {
     component B {
         (port1)
     }
     B.port1 -- A.(extPort)
    }

4. 委托连接器(Delegation Connector)

表示将外部请求委托给内部组件处理,常见于Facade模式。

基础示例

@startuml
component "API网关" as Gateway {
    interface "路由接口" as Router
    component "负载均衡器" as LB
    
    Router -down-> LB : 委托调用
}

[移动客户端] -> Gateway.Router
@enduml

端口委托示例

@startuml
component "智能家居系统" {
    portin 用户指令
    component "语音识别模块"
    
    用户指令 --> 语音识别模块 : 指令转译
}
@enduml

使用建议

  1. 明确标注委托方向(-up->-down->
  2. 对关键委托链路添加序号表示调用顺序
  3. 组合使用端口和接口提高可读性

综合应用案例

@startuml
!define AWSPREFIX https://raw.githubusercontent.com/awslabs/aws-icons-for-plantuml/v14.0/dist
!includeurl AWSPREFIX/Compute/EC2.puml
!includeurl AWSPREFIX/Database/RDS.puml

component "电商平台" {
    [订单服务] as Order
    [支付服务] as Payment
    
    interface "支付接口" as PI {
        + process()
        + refund()
    }
    
    Order --> PI
    Payment .up.|> PI
}

EC2("前端服务器") --> Order : HTTPS
RDS("订单数据库") <-- Order : JDBC
@enduml

连接方式选择指南

连接类型适用场景注意事项
依赖关系快速草图、简单系统容易产生歧义
提供/使用接口明确接口契约的架构需要维护接口定义
组装连接器复杂组件内部设计可能造成图形过于复杂
委托连接器代理模式、Facade模式需要明确委托方向

建议在架构设计的不同阶段采用不同连接方式:

  1. 初期探索:使用简单依赖关系
  2. 详细设计:转换为接口连接
  3. 实现阶段:补充组装和委托关系

通过合理运用这些连接方式,可以构建出既准确反映系统架构又易于理解的组件图。

评论已关闭