Design Patterns: Mẫu Mediator

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Vấn đề đặt ra

Cách thiết kế hướng đối tượng khuyến khích việc phân bố các ứng xử giữa các đối tượng. Vịêc phân chia đó có thể dẫn đến cấu trúc trong đó tồn tại rất nhiều liên kết giữa các đối tượng mà trong trường hợp xấu nhất là tất cả các đối tượng đều liên kết trực tiếp với nhau.

Lấy ví dụ về một hộp thoại sử dụng một cửa sổ để biểu diễn các widget như các nút, menu và entry field :

mediator-widget

Thường các widgets trong cùng một cửa sổ sẽ có sự phụ thuộc lẫn nhau. Lấy ví dụ một nút bị disable khi một entry field rỗng, việc thay đổi chọn lựa trong listbox dẫn đến thay đổi giá trị trong entry field ...

Mỗi dialog sẽ có một ràng buộc riêng biệt giữa các widgets của nó vì thế cho dù nếu hai dialog cùng hiển thị các widgets như nhau nhưng chúng vẫn không thể sử dụng lại các lớp widgets đã xây dựng.

Ta có thể tránh vấn đề này bằng cách xây dựng đối tương trung gian mediator có nhiệm vụ điều khiển và xác định tương tác giữa một nhóm các đối tượng. Khi đó các đối tượng trong nhóm không cần liên kết trực tiếp với nhau mà chỉ cần liên kết với đối tượng mediator.

Ví dụ về việc thay đổi chọn lựa trong listbox dẫn đến thay đổi giá trị trong entry field sử dụng mediator FontDialogDirector :

Biểu đồ đối tượng :

mediator: object diagram

Biểu đồ diễn tiến :

mediator: progressing diagram

Biều đồ lớp :

mediator: class diagram

Định nghĩa

Mediator dùng để đóng gói cách thức tương tác của một tập hợp các đối tượng.

Giảm bớt liên kết và cho phép thay đổi cách thức tương tác giữa các đối tượng.

Biểu đồ UML

mediator: uml diagram

Mediator (IChatroom)

  • Định nghĩa một giao diện cho việc giao tiếp với đối tượng cộng tác.

ConcreteMediator (Chatroom)

  • Xây dựng các hành vi tương tác giữa các đối tượng colleague
  • Xác định các đối tượng colleague

Colleague classes (Participant)

  • Mỗi lớp Colleague đều xác định đối tượng Mediator tương ứng
  • Mỗi đối tượng colleague trao đổi với đối tượng mediator khi muốn trao đổi với colleague khác.

Ứng dụng

Mẫu Mediator có những ưu và nhược điểm sau :

  • Giảm việc chia lớp con
  • Giảm liên kết giữa các colleagues.
  • Đơn giản hoá giao thức giữa đối tượng bằng cách thay các tương tác nhiều - nhiều bằng tương tác 1 - nhiều giữa nó và các colleagues.
  • Trừu tượng hoá cách thức tương tác hợp tác giữa các đối tượng. Tạo ra sự tách biệt rõ ràng hơn giữa các tương tác ngoài và các đặc tính trong của đối tượng.
  • Điều khiển trung tâm: thay sự phức tạp trong tương tác bằng sự phức tạp tại mediator.

Ứng dụng mediator vào trong các trường hợp sau :

  • Một nhóm các đối tượng trao đổi thông tin một cách rõ ràng nhưng khá phức tạp dẫn đến hệ thống các kết nối không có cấu trúc và khó hiểu.
  • Việc sử dụng lại một đối tượng gặp khó khăn vì nó liên kết với quá nhiều đối tượng khác.
  • Cho phép tuỳ biến một ứng xử được phân tán trong vài lớp mà không phải phân nhiều lớp con.

Các mẫu liên quan

Facade khác với Mediator ở chỗ nó trừu tượng một hệ thống con của các đối tượng để cung cấp một giao diện tiện ích hơn. Giao thức của nó theo một hướng duy nhất đó là, các đối tượng Facade tạo ra các yêu cầu của các lớp hệ thống con nhưng không có chiều ngược lại. Ngược lại Mediator cho phép các hành vi kết hợp mà các đối tượng cộng tác không thể cung cấp và giao thức này là không đa hướng.

Các cộng tác có thể đi giao tiếp với Mediator bằng cách sử dụng mẫu Observer.

» Tiếp: Mẫu Memento
« Trước: Mẫu Iterator
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!