Mối quan hệ giữa các lớp trong sơ đồ lớp (Class Diagram) UML

Trong sơ đồ lớp UML, các lớp không tồn tại độc lập mà có mối quan hệ với nhau. Dưới đây là các loại quan hệ chính, cùng với giải thích chi tiết và ví dụ cụ thể.


Association (Quan hệ liên kết)

? Định nghĩa:

  • Biểu diễn mối quan hệ giữa hai lớp mà một lớp có thể tương tác với lớp kia.
  • Thường dùng khi một lớp cần tham chiếu hoặc sử dụng các thuộc tính, phương thức của lớp khác.
  • Mối quan hệ có thể là một-một (1-1), một-nhiều (1-N) hoặc nhiều-nhiều (N-N).

? Ví dụ thực tế:
Giả sử một sinh viên (Student) có thể ghi danh vào nhiều khóa học (Course), và một khóa học có nhiều sinh viên.

+-------------+         +-------------+
|  Student    | 1     N |   Course    |
+-------------+ ------- +-------------+

Code Java:

class Student {
    String name;
    List<Course> courses; // Một sinh viên có thể học nhiều khóa học
}

class Course {
    String courseName;
    List<Student> students; // Một khóa học có nhiều sinh viên
}

? Đặc điểm nhận diện:

  • Biểu diễn bằng đường thẳng giữa hai lớp.
  • Số lượng thể hiện (multiplicity) như 1, N, 0..1, 1..*, * để mô tả mối quan hệ.

Aggregation (Tập hợp - Quan hệ "has-a" yếu)

? Định nghĩa:

  • Là một dạng liên kết đặc biệt, trong đó một lớp chứa nhiều thể hiện của lớp khác nhưng chúng vẫn có thể tồn tại độc lập.
  • Là một mối quan hệ "has-a" (có-thể-có) nhưng không quá chặt chẽ.
  • Đối tượng con có thể tồn tại độc lập với đối tượng cha. Nếu đối tượng cha bị xóa, đối tượng con vẫn có thể tồn tại.
  • Mô tả quan hệ "has-a" (có chứa nhưng không ràng buộc hoàn toàn).
  • Được biểu diễn bằng một đường thẳng có hình hình thoi rỗng (◊) ở đầu lớp chủ thể.

? Ví dụ thực tế:
Một lớp "Department" có nhiều "Employee", nhưng nếu phòng ban bị xóa, nhân viên vẫn có thể tồn tại.

+--------------+ ◇----- +-----------+
| Department   | 1    N | Employee  |
+--------------+        +-----------+

Code Java:

class Employee {
    String name;
}

class Department {
    String departmentName;
    List<Employee> employees; // Một phòng ban có nhiều nhân viên
}

? Đặc điểm nhận diện:

  • Biểu diễn bằng hình thoi rỗng (◊) ở đầu lớp chủ thể (Department).
  • Các đối tượng con có thể tồn tại độc lập.

Composition (Thành phần - Quan hệ "has-a" mạnh)

? Định nghĩa:

  • Giống Aggregation nhưng mạnh hơn: Nếu lớp chủ thể bị xóa, lớp con cũng bị xóa theo.
  • Quan hệ "part-of" (một phần của).
  • Là một mối quan hệ "has-a" nhưng mạnh hơn Aggregation.
  • Đối tượng con không thể tồn tại độc lập nếu không có đối tượng cha.
  • Biểu diễn bằng hình thoi đen (◆) ở đầu lớp chủ thể.

? Ví dụ thực tế:
Một "House" (ngôi nhà) có nhiều "Room" (phòng), nhưng nếu ngôi nhà bị phá, tất cả các phòng cũng bị phá hủy.

+--------+ ◆----- +-------+
| House  | 1    N | Room  |
+--------+        +-------+

Code Java:

class Room {
    String type;
}

class House {
    private List<Room> rooms = new ArrayList<>();

    House() {
        this.rooms.add(new Room()); // Khi House được tạo, Room cũng được tạo
    }
}

? Đặc điểm nhận diện:

  • Biểu diễn bằng hình thoi đen (◆).
  • Nếu lớp chủ thể bị xóa, lớp con cũng bị xóa theo.

Sự khác biệt của mối quan hệ Aggregation (Tập hợp) và Composition (Thành phần)

Tiêu chí Aggregation (Tập hợp) Composition (Thành phần)
Mức độ liên kết Yếu (weak association) Mạnh (strong association)
Sự phụ thuộc Đối tượng con có thể tồn tại độc lập với đối tượng cha Đối tượng con không thể tồn tại nếu không có đối tượng cha
Xóa đối tượng cha Không ảnh hưởng đến đối tượng con Xóa cha → xóa con
Ký hiệu UML Hình thoi rỗng (◇) Hình thoi đặc (◆)

Generalization (Kế thừa – Inheritance)

? Định nghĩa:

  • Là quan hệ "is-a" (là một loại của).
  • Một lớp con kế thừa thuộc tính và phương thức của lớp cha.
  • Biểu diễn bằng một đường thẳng với mũi tên rỗng (△) chỉ về lớp cha.

? Ví dụ thực tế:
Một "Dog" (chó)"Cat" (mèo) đều là "Animal" (động vật).

       +--------+
       | Animal |
       +--------+
           △
    ----------------
    |              |
+--------+    +-------+
|  Dog   |    |  Cat  |
+--------+    +-------+

Code Java:

class Animal {
    void makeSound() {
        System.out.println("Some sound...");
    }
}

class Dog extends Animal {
    void makeSound() {
        System.out.println("Woof!");
    }
}

? Đặc điểm nhận diện:

  • Biểu diễn bằng mũi tên rỗng (△) chỉ về lớp cha.
  • Lớp con có thể ghi đè (override) phương thức của lớp cha.

Dependency (Phụ thuộc)

? Định nghĩa:

  • Một lớp sử dụng một lớp khác nhưng không sở hữu nó.
  • Khi lớp A thay đổi, lớp B có thể bị ảnh hưởng.
  • Biểu diễn bằng đường nét đứt (---→).

? Ví dụ thực tế:
Một "Order" phụ thuộc vào "PaymentService" để xử lý thanh toán.

+--------+  ---→  +-----------------+
| Order  |        | PaymentService  |
+--------+        +-----------------+

Code Java:

class PaymentService {
    void processPayment() {
        System.out.println("Processing payment...");
    }
}

class Order {
    void checkout() {
        PaymentService payment = new PaymentService();
        payment.processPayment();
    }
}

? Đặc điểm nhận diện:

  • Biểu diễn bằng đường nét đứt (---→).
  • Quan hệ lỏng lẻo, không sở hữu đối tượng.

Tóm tắt các loại quan hệ và cách nhận diện

Quan hệ Biểu diễn Đặc điểm chính
Association (Liên kết) Đường thẳng Một lớp có liên kết với lớp khác (1-1, 1-N, N-N).
Aggregation (Tập hợp) Hình thoi rỗng (◊) Lớp con có thể tồn tại độc lập với lớp cha.
Composition (Thành phần) Hình thoi đen (◆) Lớp con bị xóa khi lớp cha bị xóa.
Generalization (Kế thừa) Mũi tên rỗng (△) Lớp con kế thừa thuộc tính và phương thức của lớp cha.
Dependency (Phụ thuộc) Đường nét đứt (---→) Một lớp dùng lớp khác mà không sở hữu nó.

Kết luận

  • Hiểu rõ các loại quan hệ giúp thiết kế hệ thống dễ bảo trì, mở rộng và sử dụng hiệu quả mô hình hướng đối tượng (OOP).
  • Khi thiết kế sơ đồ lớp UML, hãy chọn loại quan hệ phù hợp với thực tế hệ thống để tránh sự phức tạp không cần thiết.