Danh mục:
Tôi tình cờ bắt gặp một bài viết hay khi đang học về từ khóa final, nên muốn giới thiệu. Đây là bài nói về sự khác nhau giữa Delegation (Ủy nhiệm), Composition (Thành phần hóa / Kết hợp) và Aggregation (Tập hợp) trong mô hình hóa đối tượng.
Nguồn gốc bài là từ một câu hỏi trên StackOverflow, và tôi dịch lại để dễ nhớ hơn.
1. Ý tưởng của Composition
Hãy lấy ví dụ về một ngôi nhà và các phòng bên trong:
- Một ngôi nhà chứa nhiều phòng.
- Phòng không thể tồn tại một mình nếu không có ngôi nhà.
- Khi ngôi nhà được tạo ra, các phòng cũng được tạo.
- Khi ngôi nhà bị hủy, các phòng cũng bị hủy theo.
Đây chính là mối quan hệ Composition: tức là đối tượng A sở hữu đối tượng B và B không thể tồn tại độc lập mà không có A.
🔹 Tóm lại:
Composition = Has-a (mối quan hệ sở hữu).
Ví dụ minh họa bằng Java:
public class Room { Room() { } ... } public class House { private List<Room> rooms; public House(int CountOfRoom) { rooms = new ArrayList<Room>(); for (int i = 0; i < CountOfRoom; i++) { rooms.add(new Room()); } } ... }
2. Ý tưởng của Aggregation
Aggregation cũng giống như Composition nhưng khác ở mức độ sở hữu:
A và B là hai đối tượng riêng biệt.
- Khi A chứa B, A không thực sự “sở hữu” B, mà chỉ là một tập hợp chứa B.
- Nếu tập hợp A bị xóa, các đối tượng B vẫn còn tồn tại nếu có tham chiếu từ nơi khác.
Ví dụ trong bài là ngôi nhà đồ chơi được làm từ nhiều khối Lego:
- Ngôi nhà đồ chơi có nhiều khối Block.
- Khi ngôi nhà bị phá, các khối Block vẫn còn nguyên.
👉 Tóm lại:
Aggregation = B là một phần của A, nhưng B có thể tồn tại độc lập.
Java ví dụ:
public class ToyHouse { private List<Block> blocks; public ToyHouse(Block... blocks) throws Exception { if (blocks == null) { throw new Exception("Toy house needs blocks"); } this.blocks = new ArrayList<Block>(); for (Block b : blocks) { this.blocks.add(b); } } }
3. Ý tưởng của Delegation
Delegation (Ủy nhiệm) có nghĩa là không tự làm việc đó, mà giao công việc cho người khác làm.
Trong lập trình đối tượng, điều này thường xảy ra khi một đối tượng A muốn thực hiện một hành động, nhưng thay vì tự cài đặt, nó gọi (ủy nhiệm) hành động đó cho một đối tượng B khác mà nó có.
Ví dụ trong bài:
public class BadBoss { Sawon sawon = new Sawon(); public void doCopy() { // Thay vì tự sao chép, giao việc cho Sawon sawon.doCopy(); } } public class Sawon { public void doCopy() { ... } public void makeDocu() { ... } }
Trong ví dụ này:
BadBoss không thực hiện việc sao chép trực tiếp, mà ủy nhiệm cho đối tượng Sawon thực hiện.
👉 Tóm lại:
Delegation = Giao trách nhiệm cho đối tượng khác để xử lý.
Kết luận ngắn gọn
- Composition: Đối tượng A sở hữu B; B không tồn tại nếu A bị hủy.
- Aggregation: A chứa B như một tập hợp; B có thể tồn tại độc lập.
- Delegation A không làm trực tiếp mà giao cho B thực hiện.
Nguồn bài viết dịch từ ryukato.github.io