UML 类图符号含义

UML类图

在 UML 类图中,每个符号都有其特定的含义。以下是常见符号的解释:

  • +: Public(公共访问权限)
  • -: Private(私有访问权限)
  • #: Protected(受保护访问权限)
  • ~: Package(包访问权限)
  • 下划线: Static(静态成员)

对应的 Java 类示例:

class Person {
    public String name;      // 公共属性
    private Integer age;     // 私有属性
    protected Double weight; // 受保护属性
    Double height;           // 包访问权限属性
    public char gender;      // 公共属性

    public void eat(String food) {}   // 公共方法
    protected void drink() {}         // 受保护方法
    String walk() { return "walk"; }  // 包访问权限方法
}

UML 类图讲解

大话设计模式UML类图

UML 类图关系符号讲解

1. 箭头(关联与依赖)

箭头是最常见,依赖与关联也是最常见的,对应理解为类的属性+类的行为参数

  • 实线箭头:关联关系(强依赖),表示一个类的属性中引用了其他类的实例,通常表示“拥有”或“包含”关系",实例化类的时候其他类也必须存在。
  • 虚线箭头:依赖关系(弱依赖),表示类的方法参数中引用了其他类,或者方法中使用了其他类的实例,如果不调用方法,类的实例就不会被使用

2. 三角形箭头(继承与实现)

三角形箭头比较常见,对应理解为类继承与实现

  • 三角形实线箭头继承关系,箭头指向父类。表示子类继承父类的所有属性和方法。
  • 三角形虚线箭头实现关系,箭头指向接口。表示类实现了某个接口,提供接口定义的方法。

3. 菱形箭头(聚合与组合关系)

  • 实心菱形加实线箭头:组合关系,类之间的生命周期绑定,通常表示“整体-部分”关系。比如,车包含发动机,车不存在时,发动机也随之不存在。
  • 空心菱形加实线箭头:聚合关系,表示较弱的“整体-部分”关系。即“部分”可以独立存在,且生命周期独立于“整体”。

联想记忆法

  1. 箭头:箭头指向被引入的类。可以联想为指示你需要某个对象,就像你用手指指向笔,告诉别人你需要这支笔。

  2. 实线箭头与虚线箭头

    • 实线箭头(强依赖):就像你看东西需要眼睛,表示类的属性依赖
    • 虚线箭头(弱依赖):就像吃饭需要碗筷,只有在吃饭时需要碗筷,不吃饭时就不需要,表示类的行为依赖
  3. 继承与接口

    • 继承(实线三角箭头):就像子类从父类继承了一些属性和方法,箭头指向父类,表示子类是父类的一种特殊类型。
    • 实现(虚线三角箭头):类通过实现接口来定义某些行为,箭头指向接口,表示类履行了接口规定的责任。
  4. 组合与聚合

    • 组合(实心菱形箭头):组合关系通常表示更强的耦合,类似“身体的四肢组成了一个人”,如果没有身体,四肢就没有意义,生命周期一致。
    • 聚合(空心菱形箭头):聚合关系则表示较弱的耦合,类似“你和老婆组成了一个家庭”,如果你离开了,老婆仍然可以单独存在,生命周期不一致。

难以区分的组合、依赖、关联的区别对比

组合、依赖、关联的区别对比

特性依赖关系(Dependency)关联关系(Association)组合关系(Composition)
强度弱依赖,表示类之间的行为依赖。较弱依赖,表示类之间的联系,但不涉及生命周期管理。强依赖,表示“整体-部分”关系,生命周期紧密绑定。
生命周期生命周期独立。依赖关系不会影响生命周期。生命周期独立。销毁一个对象不影响另一个对象。整体对象销毁,部分对象也会销毁。
对象的存在依赖对象仅在方法调用时存在。关联的对象可以独立存在。部分对象依赖整体对象的存在。
表示方式(UML)虚线箭头(方法或局部变量依赖)实线连接(类间简单关联)实心菱形+实线箭头
示例Person 的方法依赖于 Machine(方法参数依赖)TeacherStudent(类之间的关联)CarEngineEngineCar 的一部分)

直观对比

  • 依赖:就像你和办事人员的关系,只有在你需要办事时才会联系他们。它是临时的,不需要始终存在。更容易理解就是:方法中参数
  • 关联:就像你和老婆的关系,虽然你们不总是“办事”,但是你们的关系始终存在。你们之间的联系可以是双向的。更容易理解就是:实体类中引入的其他类
  • 组合:就像“身体-四肢”的关系,如果身体消失,四肢也随之消失。更容易理解就是:实体类中属性

区别总结

  • 依赖关系:表示类之间较弱的行为依赖,通常通过方法参数或局部变量来表示。生命周期是独立的,类之间没有持久的引用关系。
  • 关联关系:表示类之间的联系,通常通过属性或方法参数引用另一个类。对象的生命周期独立,类之间是松散的联系。
  • 组合关系:表示“整体-部分”关系,整体和部分对象的生命周期紧密绑定,部分对象依赖整体对象的存在,销毁整体对象会导致部分对象的销毁。
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐