示例:学校管理系统

系统角色

  1. Person:抽象类,表示所有人的通用属性和行为。
  2. Student 和 Teacher:分别继承 Person。
  3. Course:课程类,表示学生和老师之间的关联。
  4. Classroom:表示课程的组织场所,使用组合关系。

PlantUML 代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
@startuml
!pragma layout smetana
' 定义抽象类和接口
abstract class Person {
- String name
- int age
+ void getInfo()
}

interface Payment {
+ void payFees(double amount)
}

' 具体类继承和实现
class Student{
- String studentID
+ void enrollCourse(Course course)
+ void payFees(double amount)
}

class Teacher{
- double salary
+ void teachCourse(Course course)
}

' 课程类和关联关系
class Course {
- String courseName
- int courseID
+ void assignTeacher(Teacher teacher)
+ void enrollStudent(Student student)
}

' 聚合和组合关系
class Classroom {
- String roomNumber
- int capacity
+ void scheduleCourse(Course course)
}

' 定义关系
Person <|-- Student
Person <|-- Teacher
Student ..|> Payment
Course *-- Student
Course o-- Teacher
Classroom *-- Course
@enduml

输出图的解读

  1. 继承:Student 和 Teacher 继承了抽象类 Person。使用 实线三角箭头 (<|–) 表示继承。
  2. 实现:Student 实现了接口 Payment。使用 虚线三角箭头 (…|>) 表示实现关系。
  3. 关联:Course 和 Student 之间的关联。使用 实线箭头 (–) 表示关联关系。
  4. 聚合:Course 和 Teacher 之间使用聚合关系。使用 空心菱形箭头 (o–) 表示聚合。
  5. 组合:Classroom 和 Course 之间使用组合关系。使用 实心菱形箭头 (*–) 表示组合。

代码示例(Java)

以下是根据类图生成的 Java 代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// 抽象类
abstract class Person {
protected String name;
protected int age;

public abstract void getInfo();
}

// 接口
interface Payment {
void payFees(double amount);
}

// Student 类继承 Person 并实现 Payment
class Student extends Person implements Payment {
private String studentID;

@Override
public void getInfo() {
System.out.println("Student Name: " + name);
}

public void enrollCourse(Course course) {
System.out.println(name + " enrolled in " + course.getCourseName());
}

@Override
public void payFees(double amount) {
System.out.println(name + " paid: " + amount);
}
}

// Teacher 类继承 Person
class Teacher extends Person {
private double salary;

@Override
public void getInfo() {
System.out.println("Teacher Name: " + name);
}

public void teachCourse(Course course) {
System.out.println(name + " is teaching " + course.getCourseName());
}
}

// Course 类
class Course {
private String courseName;
private int courseID;

public void assignTeacher(Teacher teacher) {
System.out.println(teacher.name + " assigned to " + courseName);
}

public void enrollStudent(Student student) {
System.out.println(student.name + " enrolled in " + courseName);
}

public String getCourseName() {
return courseName;
}
}

// Classroom 类
class Classroom {
private String roomNumber;
private int capacity;

public void scheduleCourse(Course course) {
System.out.println("Course scheduled in room " + roomNumber);
}
}