定义

导航方向(Navigability)表示类之间是否、以及如何相互访问。
简单理解:
“谁知道谁” 或 “谁能访问谁”。

UML 中的三种导航类型

类型
UML箭头
Java实现
含义
单向导航
A --> B
A 持有 B 的引用
A 可以访问 B
双向导航
A <--> B
A、B 互相持有引用
双方可以访问对方
无导航
A -- B
无引用关系
仅逻辑存在

示例:单向导航

  • 含义:
    • Customer 可以访问 Order;
    • Order 不知道 Customer 的存在。
  • Java 实现:
    • 优点:
      • 低耦合,依赖方向清晰。
      • 推荐在大多数业务场景中使用。

    示例:双向导航

    • 含义:
      • Customer 可以访问自己的订单;
      • Order 也能知道它属于哪个顾客。
    • Java 实现:
      • 注意:
        • 双向关系常出现在 ORM(JPA/Hibernate)中;
        • 需避免序列化时的无限递归问题(如使用 @JsonIgnore)。

      导航方向的设计建议

      场景
      推荐方向
      说明
      普通业务逻辑
      单向导航
      低耦合、易维护
      ORM数据库实体
      双向导航
      方便外键映射
      边界模块访问
      单向导航
      保持模块独立
      只需逻辑表示
      无导航
      高层概念建模

      实际系统示例:购物系统类图

      • 说明:
        • Customer 通过单向导航访问 Order
        • Order 通过单向导航访问 OrderItem
        • OrderItem 引用 Product
        • 所有导航均为单向、低耦合设计
      • Java实现:

        总结:导航性设计核心原则

        原则
        说明
        ✅ 单向优先
        只让需要访问的类持有引用
        ✅ 控制依赖
        避免双向互相访问
        ✅ 明确多重性
        用 1、0..1、0..* 表示数量
        ✅ ORM例外
        双向导航可用于数据库外键映射
        ✅ 关注数据流
        导航方向应反映数据流向
        UML笔记——各种图示例UML笔记——类图中的多重性