UML关联端归属规则及关联类相关技术问题咨询
UML关联端所有权相关问题解答
1. 现实世界示例
拿「学生-课程」的选课关系举例:
- 由端点分类器拥有:每个学生都清楚自己选了哪些课,对应在
Student类里加一个enrolledCourses列表属性。这就是学生这个端点分类器拥有了关联端——关联的引用直接存储在学生对象中。 - 由关联本身拥有:如果需要记录学生选课的成绩、选课时间这类和“选课行为”直接绑定的信息,这时关联本身(选课关系)成为信息的载体。比如学校的选课系统里,会专门有一张「选课记录表」,里面存学生ID、课程ID、成绩、选课时间,既关联了学生和课程,又保存了额外信息,这就是关联本身拥有关联端的场景。
2. “由关联本身拥有”的具体含义
当关联端由关联本身拥有时,两个类对象之间的连接关系,不会存储在任意一端的类实例里,而是存储在关联的实例中。这种设计的核心是为了承载关联关系本身的附加信息——这些信息不属于关联的任意一端,而是属于“两个对象发生关联”这个行为或状态。
简单说:普通关联是A类存B的引用,或者B类存A的引用;而关联本身拥有时,是用一个独立的“中间实体”来维护A和B的连接,同时这个实体可以存储额外数据。
3. 关联类是什么?代码实现方式
关联类的定义
关联类是UML里的特殊元素:它既是关联(负责连接两个分类器),又是类(可以拥有自己的属性、操作)。专门用来处理“关联关系需要携带额外信息”的场景——这些信息不属于关联的任何一端,而是属于关联本身。
代码实现(Java示例)
还是用「学生-课程-选课成绩」的场景:
首先定义基础的学生和课程类:
public class Student { private String studentId; private String name; public Student(String studentId, String name) { this.studentId = studentId; this.name = name; } // getter/setter 省略 } public class Course { private String courseCode; private String courseName; public Course(String courseCode, String courseName) { this.courseCode = courseCode; this.courseName = courseName; } // getter/setter 省略 }
然后实现关联类Enrollment(选课记录),它负责关联学生和课程,同时存储成绩、选课时间:
import java.time.LocalDate; public class Enrollment { private Student student; private Course course; private double score; private LocalDate enrollDate; public Enrollment(Student student, Course course, double score, LocalDate enrollDate) { this.student = student; this.course = course; this.score = score; this.enrollDate = enrollDate; } // getter/setter 省略 }
使用时,通过关联类实例建立连接并存储附加信息:
public class Main { public static void main(String[] args) { Student alice = new Student("S001", "Alice"); Course math = new Course("MATH101", "高等数学"); // 创建选课记录,关联学生和课程,同时保存成绩和选课日期 Enrollment aliceMathEnroll = new Enrollment(alice, math, 92.5, LocalDate.of(2024, 9, 1)); } }
这里的Enrollment就是关联类,它的每个实例对应一个具体的关联关系,同时承载了关联本身的附加属性。
内容的提问来源于stack exchange,提问作者Wylie
相关产品推荐
相关产品推荐

