0
0
Lập trình
Admin Team
Admin Teamtechmely

Mẫu Thiết Kế Mediator trong Python: Giảm Phụ Thuộc Giữa Các Đối Tượng

Đăng vào 4 ngày trước

• 6 phút đọc

Mẫu Thiết Kế Mediator trong Python

Mẫu thiết kế Mediator là một trong những mẫu thiết kế nổi bật trong lập trình hướng đối tượng, giúp giảm bớt sự phụ thuộc lẫn nhau giữa các đối tượng. Thay vì để các đối tượng giao tiếp trực tiếp với nhau, mẫu thiết kế này sử dụng một đối tượng trung gian (mediator) để quản lý và điều phối sự tương tác giữa các đối tượng. Trong bài viết này, chúng ta sẽ tìm hiểu chi tiết về mẫu thiết kế Mediator, cách áp dụng nó trong Python và một số thực tiễn tốt nhất để triển khai.

Mục Lục

  1. Giới thiệu về Mẫu Thiết Kế Mediator
  2. Cấu Trúc của Mẫu Mediator
  3. Ví dụ Thực Tế
  4. Thực Hành Tốt Nhất
  5. Cạm Bẫy Thường Gặp
  6. Mẹo Tối Ưu Hiệu Suất
  7. Giải Quyết Vấn Đề
  8. Kết Luận

Giới thiệu về Mẫu Thiết Kế Mediator {#gioi-thieu}

Mẫu thiết kế Mediator giúp tổ chức mã của bạn bằng cách hạn chế việc giao tiếp trực tiếp giữa các đối tượng. Thay vào đó, các đối tượng sẽ giao tiếp thông qua mediator, giúp giảm thiểu sự phức tạp và làm cho mã dễ bảo trì hơn. Điều này đặc biệt hữu ích trong các ứng dụng lớn với nhiều đối tượng tương tác với nhau.

Cấu Trúc của Mẫu Mediator {#cau-truc}

Mẫu Mediator thường bao gồm các thành phần chính sau:

  • Mediator Interface: Đây là giao diện mà các đối tượng sẽ sử dụng để thông báo cho mediator về các sự kiện.
  • Concrete Mediator: Cài đặt cụ thể của mediator, nơi quản lý sự tương tác giữa các đối tượng.
  • Colleagues: Các đối tượng mà mediator điều phối.

Ví dụ Thực Tế {#vi-du}

Hãy cùng xem một ví dụ đơn giản để hiểu rõ hơn về mẫu Mediator.

Giả sử có hai sinh viên, Ridit và Rajdeep, có nhiều trách nhiệm trong một lớp học. Tuy nhiên, giữa họ đã xảy ra một cuộc xung đột khiến họ không còn giao tiếp với nhau. Lúc này, ClassMonitor sẽ đóng vai trò là mediator giữa Ridit và Rajdeep. Khi Ridit cần Rajdeep thực hiện một nhiệm vụ, anh ấy sẽ thông báo cho ClassMonitor và sau đó ClassMonitor sẽ yêu cầu Rajdeep thực hiện nhiệm vụ cần thiết.

Mã Nguồn cho Mẫu Mediator

Dưới đây là mã Python minh họa cho mẫu thiết kế này:

python Copy
from abc import ABC, abstractmethod

class ClassMonitor(ABC):
    """
    Giao diện Mediator khai báo một phương thức được sử dụng bởi các thành phần
    để thông báo cho mediator về các sự kiện khác nhau.
    """
    @abstractmethod
    def notify(self, sender, event):
        pass

class ConcreteClassMonitor(ClassMonitor):
    """
    Mediator cụ thể thực hiện hành vi hợp tác bằng cách điều phối nhiều
    thành phần.
    """
    def __init__(self, student1, student2):
        self.student1 = student1
        self.student2 = student2
        self.student1.set_monitor(self)
        self.student2.set_monitor(self)

    def notify(self, sender, event):
        if event == "A":
            print("Class Monitor phản ứng với sự kiện A và yêu cầu Rajdeep làm nhiệm vụ C")
            self.student2.do_c()
        elif event == "D":
            print("Class Monitor phản ứng với sự kiện D và yêu cầu Ridit làm nhiệm vụ B và Rajdeep làm nhiệm vụ C")
            self.student1.do_b()
            self.student2.do_c()

class BaseStudent:
    """
    Thành phần cơ bản cung cấp chức năng lưu trữ tham chiếu đến mediator.
    """
    def __init__(self, monitor=None):
        self._monitor = monitor

    def get_monitor(self):
        return self._monitor

    def set_monitor(self, monitor):
        self._monitor = monitor

class Ridit(BaseStudent):
    def do_a(self):
        print("Ridit thực hiện A.")
        self._monitor.notify(self, "A")

    def do_b(self):
        print("Ridit thực hiện B.")
        self._monitor.notify(self, "B")

class Rajdeep(BaseStudent):
    def do_c(self):
        print("Rajdeep thực hiện C.")
        pass

    def do_d(self):
        print("Rajdeep thực hiện D")
        self._monitor.notify(self, "D")

if __name__ == '__main__':
    ridit = Ridit()
    rajdeep = Rajdeep()
    class_monitor = ConcreteClassMonitor(ridit, rajdeep)

    print("Giáo viên yêu cầu Ridit thực hiện A")
    ridit.do_a()
    print("-" * 30)

    print("Giáo viên yêu cầu Rajdeep thực hiện D.")
    rajdeep.do_d()

Khi chạy đoạn mã trên, đầu ra sẽ như sau:

Copy
Giáo viên yêu cầu Ridit thực hiện A
Ridit thực hiện A.
Class Monitor phản ứng với sự kiện A và yêu cầu Rajdeep làm nhiệm vụ C
Rajdeep thực hiện C.
Giáo viên yêu cầu Rajdeep thực hiện D.
Rajdeep thực hiện D
Class Monitor phản ứng với sự kiện D và yêu cầu Ridit làm nhiệm vụ B và Rajdeep làm nhiệm vụ C
Ridit thực hiện B.
Rajdeep thực hiện C.

Thực Hành Tốt Nhất {#thuc-hanh-tot-nhat}

  • Giảm thiểu số lượng phương thức trong Mediator: Giữ cho mediator đơn giản và rõ ràng.
  • Tách biệt logic kinh doanh: Đảm bảo rằng mediator chỉ xử lý việc điều phối và không chứa logic kinh doanh.
  • Sử dụng các sự kiện rõ ràng: Đặt tên cho các sự kiện một cách rõ ràng để dễ dàng theo dõi và xử lý.

Cạm Bẫy Thường Gặp {#cam-bay}

  • Mediators quá phức tạp: Nếu mediator trở nên quá phức tạp, nó có thể trở thành điểm nghẽn cho hiệu suất.
  • Phụ thuộc vào mediator: Đảm bảo rằng các đối tượng không phụ thuộc quá nhiều vào mediator, điều này có thể dẫn đến sự cứng nhắc trong mã.

Mẹo Tối Ưu Hiệu Suất {#meo-toi-uu}

  • Sử dụng các pattern khác khi cần thiết: Kết hợp với các mẫu thiết kế khác như Observer hay Strategy để tối ưu hóa hiệu suất.
  • Đảm bảo xử lý bất đồng bộ: Nếu các đối tượng cần thực hiện các tác vụ bất đồng bộ, hãy xem xét việc sử dụng các thư viện hỗ trợ như asyncio.

Giải Quyết Vấn Đề {#giai-quyet-van-de}

Khi gặp sự cố, hãy kiểm tra:

  • Xem xét xem các đối tượng có được kết nối đúng cách với mediator hay không.
  • Đảm bảo rằng các sự kiện được thông báo đúng cách và mediator phản ứng một cách mong đợi.

Kết Luận {#ket-luan}

Mẫu thiết kế Mediator là một công cụ mạnh mẽ trong lập trình hướng đối tượng, giúp giảm thiểu sự phụ thuộc giữa các đối tượng và tổ chức mã nguồn của bạn tốt hơn. Bằng cách sử dụng mediator, bạn có thể tạo ra các ứng dụng dễ dàng bảo trì và mở rộng.

Hãy thử áp dụng mẫu thiết kế này trong dự án của bạn và cảm nhận sự khác biệt trong cách tổ chức mã nguồn!

Câu Hỏi Thường Gặp (FAQ)

1. Mẫu thiết kế Mediator có thể sử dụng trong những trường hợp nào?
Nó rất hữu ích trong các ứng dụng có nhiều đối tượng cần tương tác mà không muốn tạo ra sự phụ thuộc chặt chẽ.

2. Có phải tất cả các tương tác giữa các đối tượng đều cần qua mediator không?
Không nhất thiết, nhưng việc sử dụng mediator có thể giúp tổ chức mã tốt hơn.

3. Mẫu thiết kế Mediator có thể kết hợp với mẫu nào khác không?
Có, bạn có thể kết hợp Mediator với Observer, Strategy, hoặc Command để tối ưu hóa hiệu suất và tính linh hoạt của ứng dụng.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào