Design Patterns trong Python

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.

  • Nâng cao
  • Đọc trong 3 phút
  • 1 ví dụ chạy được
Bạn sẽ học được gì
  • Các đồng nghiệp (colleague) và một mediator
  • Gửi tin qua mediator
  • Giảm phụ thuộc nhiều - nhiều
ChatRoom
  • ChatRoommediator
    • Adagử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

  1. Mỗi người dùng chỉ biết phòng chat, không biết những người khác.
  2. Phòng chat chuyển mỗi tin nhắn tới người nhận.
  3. 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ụ

Chạy code →
main.py
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")
Lấy nút Run cho ví dụ này

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.

  1. Thay đổi domain của ví dụ nhưng vẫn giữ nguyên cấu trúc của design pattern.
  2. So sánh design pattern với một implementation đơn giản hơn và giải thích các trade-off.
  3. Viết test cho từng thành phần trước khi thêm một implementation khác.
Chạy trong trình biên dịch Python →