Mẫu thiết kế Mediator trong Python
Chuyển tin nhắn giữa các đối tượng qua một điều phối viên, như người dùng trong phòng chat, để chúng không cần biết nhau.
- Các đồng nghiệp (colleague) và một mediator
- Gửi tin qua mediator
- Giảm phụ thuộc nhiều - nhiều
ChatRoommediatorAdagửi "Hello"LinLin from Ada: Hello
Nói chuyện qua trung tâm
Mediator là mẫu thiết kế dùng một đối tượng trung gian để điều phối giao tiếp giữa nhiều đối tượng. Thay vì mỗi đối tượng phải biết và gọi trực tiếp các đối tượng khác, chúng chỉ cần làm việc với đối tượng trung gian. Cách này giúp giảm sự phụ thuộc lẫn nhau giữa các thành phần.
Những điểm quan trọng
- Mỗi người dùng chỉ biết phòng chat, không biết những người khác.
- Phòng chat chuyển mỗi tin nhắn tới người nhận.
- Thêm người dùng mới không ảnh hưởng những người đã có.
Khi nào nên sử dụng?
- Giải quyết các vấn đề thiết kế phần mềm thường gặp bằng những design pattern đã được kiểm chứng.
- Tách biệt trách nhiệm giữa các thành phần để code dễ mở rộng và kiểm thử hơn.
- Sử dụng tên design pattern thống nhất khi thảo luận về kiến trúc phần mềm trong team.
Code ví dụ
class ChatRoom:
# Mediator: route colleague communication through a coordinator.
def send(self, sender, recipient, message):
# Coordinate communication between colleague objects.
recipient.receive(sender.name, message)
class User:
def __init__(self, name, room): self.name, self.room = name, room
def send(self, recipient, message): self.room.send(self, recipient, message)
def receive(self, sender, message): print(f"{self.name} from {sender}: {message}")
room = ChatRoom()
ada, lin = User("Ada", room), User("Lin", room)
ada.send(lin, "Hello")
Kết quả khi chạy
Lin from Ada: Hello
Giải thích code
ChatRoom đóng vai trò trung gian. Khi Ada gửi tin nhắn cho Lin, phương thức send() của User chuyển tin nhắn cho ChatRoom, và ChatRoom chuyển tiếp đến người nhận. Các đối tượng User không cần biết cách gửi tin nhắn đến nhau, nên kết quả là Lin from Ada: Hello.
Thay đổi giá trị và chạy chương trình bằng trình chạy Python online của CodeUtility mà không cần cài Python.
Bài tập mở rộng
Hãy thử chỉnh sửa code theo các gợi ý dưới đây. Tự thay đổi và quan sát kết quả sẽ giúp bạn hiểu bài sâu hơn nhiều so với chỉ đọc code.
- Thay đổi domain của ví dụ nhưng vẫn giữ nguyên cấu trúc của design pattern.
- So sánh design pattern với một implementation đơn giản hơn và giải thích các trade-off.
- Viết test cho từng thành phần trước khi thêm một implementation khác.