Design Pattern - Mediator Pattern

Mediator Pattern

Visitor Pattern là một trong những pattern thuộc nhóm Behavior Pattern - là một pattern có tính ứng dụng cao mà chúng ta đã được gặp khá nhiều trong lập trình nói chung và lập trình IOS nói riêng.

Nội dung: Vẫn sẽ như những bài trước chúng ta sẽ đi theo 3 phần chính:

  • Tổng quan về Mediator Pattern
  • Cách sử dụng Mediator Pattern
  • Ứng dụng của Mediator Pattern trong lập trình IOS

Tổng quan về Mediator Pattern

Trong lập trình nói chung và hướng đối tượng nói riêng thì việc sự phân phối hay thể hiện hành vi giữa các đối tượng luôn được khuyến khích. Điều này dẫn đến trong môt trường hợp nào đó có thể dẫn tới mọi đối tượng đều biết về nhau tạo thành một mối liên hệ chặt chẽ mà khó có thể tách ra được.

Mediator pattern sinh ra để giảm sự phức tạp trong giao tiếp giữa các lớp và các đối tượng. Cung cấp 1 lớp trung gian có nhiệm vụ xử lí thông tin liên lạc giữa các tầng lớp, hỗ trợ cho việc bảo trì code dễ dàng hơn bằng các khớp nối lỏng lẻo - tức là Các đối tượng tương đồng không giao tiếp với nhau mà sẽ thông qua một đối tương trung gian và cho phép bạn thay đổi cách tương tác giữa chúng 1 cách độc lập điều này sẽ tránh được việc gán đôi chặt chẽ của các thành phần trong hệ thống.

Các thành phần của mediator pattern

  • Colleague : là một protocol, giữ tham chiếu đến Mediator object.
  • ConcreteColleague : cài đặt các phương thức của Colleague. Giao tiếp thông qua Mediator khi cần giao tiếp với Colleague khác.
  • Mediator : là một protocol định nghĩa các phương thức để giao tiếp với các Colleague object.
  • ConcreteMediator : cài đặt các phương thức của Mediator, biết và quản lý các Colleague object.

Cách sử dụng Mediator Pattern

Cùng đi vào một ví dụ cụ thể.

Bình thường thì hoạt động trong dự án mà chúng ta hay thấy sẽ như sau: Nhìn rất rắc rối và liên kết chặt chẽ khó để thay đổi nhân sự và làm việc khá chồng chéo đúng k ạ?

và đây là mô hình sau khi áp dụng Mediator mọi giao tiếp sẽ thông qua trung gian là Mediator.

Chúng ta cùng viết ví dụ này nhé:

Đầu tiên khởi tạo protocol Mediator chứa phương thức send để giao tiếp giữa các thành viên với nhau.

protocol Mediator {
    func send(message: String, sender: Colleague)
}

tiếp theo chúng ta sẽ khởi tạo TeamMediator để implement Mediator và quản lí tất cả các thành viên trong dự án. sẽ có hoạt động thêm thành viên khác cũng như có hoạt động giao tiếp từ các thành viên.

class TeamMediator: Mediator {
    var colleagues: [Colleague] = []
    func register(colleague: Colleague) {
        colleagues.append(colleague)
    }
    func send(message: String, sender: Colleague) {
        for colleague in colleagues {
            if colleague.id != sender.id {
                colleague.receive(message: message)
            }
        }
    }
}

tiếp đó chúng ta đi tạo các thành viên của dự án

protocol Colleague {
    var id: String { get }
    var mediator: Mediator { get }
    func send(message: String)
    func receive(message: String)
}
class Developer: Colleague {
    var id: String
    var mediator: Mediator
    init(mediator: Mediator) {
        self.id = "Developer"
        self.mediator = mediator
    }
    func send(message: String) {
        mediator.send(message: message, sender: self)
    }
    func receive(message: String) {
        print("Developer received: " + message)
    }
}
class QE: Colleague {
    var id: String
    var mediator: Mediator
    init(mediator: Mediator) {
        self.id = "QE"
        self.mediator = mediator
    }
    func send(message: String) {
        mediator.send(message: message, sender: self)
    }
    func receive(message: String) {
        print("QE received: " + message)
    }
}
class PM: Colleague {
    var id: String
    var mediator: Mediator
    init(mediator: Mediator) {
        self.id = "PM"
        self.mediator = mediator
    }
    func send(message: String) {
        mediator.send(message: message, sender: self)
    }
    func receive(message: String) {
        print("PM received: " + message)
    }
}

Tất cả các thành viên đều biết mediator và có cacds phương thức giao tiếp như gửi và nhận thông tin. Thế là chúng ta đã khởi tạo xong các thành phần của Mediator pattern. Cùng nhua chạy thử xem nhé. Tiến hành khởi tạo các thành viên và teamMediator sau đó đăng kí các thành viên cho team, mỗi thành viên sẽ gửi lời chào đến tất cả.

let mediator = TeamMediator()
let qe = QE(mediator: mediator)
let developer = Developer(mediator: mediator)
let pm = PM(mediator: mediator)
mediator.register(colleague: developer)
mediator.register(colleague: qe)
mediator.register(colleague: pm)
mediator.send(message: "Hello world!", sender: developer)
mediator.send(message: "Hello world!", sender: qe)
mediator.send(message: "Hello world!", sender: pm)

Khá đơn giản phải không ạ?

Ứng dụng của Mediator Pattern trong lập trình IOS

Chắc anh em lập trình khá quen với hình ảnh sau.

Đây là Viewcontrollers trong UIKit

Ứng dụng IOS thường sử dụng thiết kế giao diện người dùng thơ chế độ và điểu hương để trình bày các màn hình của mô hình dữ liệu ứng dụng. Trong hình ảnh này thì UIViewController là một lớp trừu tượng mà có thể phân lớp để quản lí các đối tượng tool barnavigation bar. bên trong các UIViewController là các UiView như button, label... có thể tương tác và đẩy tác động ngược lại cho các thành phần khác thông qua UIViewController. Đó chính là Mediator.

Hi vọng bài viết sẽ giải quyết được thắc mắc của anh em về Mediator

Tham khảo: