Java UML 类图、Delegation

本文定义了一个 Java UML 标准,同时详细分析了各种 Delegation 及其 UML 表示。

class 和 interface

class 的类图由三部分组成:类名、域、方法。

举例

public abstract class Example {
private int x;
protected int y;
public static int z;
public Example() { ... }
public String toString() { ... }
private void foo(int x) { ... }
protected abstract int bar(int y, int z);
}

访问权限

+表示 public,#表示 protected,-表示 private。

命名习惯

采用 Algol 命名风格,字符之间不需要任何空格。

  • 变量

    name:type
    例如:y:int

  • 方法

    name(params):type,每个 parameter 又是一个变量,返回值为 void 时省去 type
    例如:bar(y:int,z:int):int

  • 元数据

    使用 guillemet(书名号)«...»
    例如:+«constructor» Example()«interface»

  • static 变量或方法

    使用下划线
    例如:+z:int

  • 抽象类或方法

    使用斜体
    例如:Example#bar(y:int, z:int):int

interfaces 需要在类名部分增加 «interface»,并且省去变量部分,如下所示。

举例

public interface FooListener {
public void foo();
}

各个类之间的关系表示

关系 UML 解释
Dependency A 依赖 B,联系较小,不常见
Association A 的实例调用 B 的实例
Aggregation A 由 B 组成,表现为 A 中有 B 类型的域
Composition A 由 B 组成,当 A 的实例被销毁时,B 的实例也会被销毁
Multiplicity 关系中有多少个对象,* 表示 0\ge 0,还可以用常数(例如 1)或者范围(例如 2…*,表示 2\ge 2
Directionality 省去箭头,表示关系具有双向性
Generalization A 较 B 更泛化,比如 B 是 A 的子类(extends)
Realization B 实现 A,比如 B 是 A 的实现(implements)

四种 Delegation 辨析

在哈工大软件构造课程 5.2 Construction for Reuse 中,详细介绍了四种 Delegation 的区别。

Dependency

这是一种很松散的关系,很少见。

class Course { ... }

class CourseSchedule {
// 只记录了 Course 的引用
private List<Course> courses;
public void add(Course c) { ... }
public void remove(Course c) { ... }
}

Association

Association 其实包含了两种种情况:Aggregation 和 Composition。3

class Course { ... }
class Student {
// >= 5 个 Course 组成
Course[] selectedCourses;
}
class Teacher {
// 由 1 或多个 Student 组成
private Student[] students;
}
class Student {
// 由 1 个 teacher 组成
private Teacher teacher;
}

Aggregation:has_a,暂时拥有

  • 计算机系暂时拥有一些教师,如果院系解散,教师人可以继续存在
  • 车子有轮胎,车坏了,轮胎可能还能用在其他地方
class Student { ... }
class Course {
// >= 15 个学生
private Student[] students;
// new 发生在 Student 类外部,通过 add 方法加入
public addStudent(Student s) {
students.append(s);
}

Composition:is_part_of,同生共死

  • 学校一旦倒闭,计算机系也不再存在了
  • 人一旦死,手、脚、❤都没有了灵魂,不再有意义了
class Heart {}
class Person {
// new 发生在 Person 类内部
private Heart heart = new Heart();
...
}

注意:平时当我们不太清楚是 aggregate 还是 composite 时,一般都是用 associate。因为 aggregate 和 composite 这两种关系非常容易界定,但是有其他一些情况各个类之间的联系一般是动态确定的,这种情况使用 associate 更加合理。

注释

与任意一个 UML 组件用虚线连接。

参考资料

  1. All the UML you need to know
  2. Software Construction at HIT | 5.2 Construction for Reuse
  3. UML Association vs Aggregation vs Composition
  4. What is the difference between association, aggregation and composition?
文章作者: upupming
文章链接: https://upupming.site/2018/06/04/java-UML/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 upupming 的博客