Chia sẻ kiến thức lập trình

Mediator Design Pattern

Hoà giải mọi tranh luận

Chắc hẳn mọi người ở đây ai cũng đã và đang sử dụng ứng dụng #chat rồi nhỉ? Câu hỏi đặt ra là làm thế nào để chúng ta có thể chat được với nhau? Nó không chỉ đơn giản là việc chúng ta soạn một tin nhắn và gửi đến người kia, đằng sau đó là cả một hệ thống server phức tạp để lưu trữ và điều hướng các #message của chúng ta đến đúng với người nhận. Tuy phức tạp như vậy nhưng nó lại được xây dựng trên một #designpattern khá gọn nhẹ đó là #mediator pattern

Mục tiêu ra đời

  • Định nghĩa ra một đối tượng đóng gói hay quy định cách mà các đối tượng sẽ tương tác với nhau: ví dụ khi một server (mediator) nhận được một message thì message đó phải có người nhận, và #server sẽ gửi message này đến đúng người nhận đó
  • Tạo ra thiết kế mềm dẻo và dễ mở rộng bằng cách loại bỏ việc tham chiếu lẫn nhau: ví dụ A gửi message đến B thì A không cần phải biết đến B và B cũng vậy không cần phải biết đến A.

Ví dụ

Trước khi có #Mediator, để A gửi nhận được message với B, code sẽ kiểu thế này:

class A {
    private B b;

    void send(String mesage) {
        b.received(message);
    }

    void received(String message) {
        print(message);
    }

}
class B {
    private A a;

    void send(String mesage) {
        a.received(message, a);
    }

    void received(String message) {
        print(message);
    }
}

Nhìn code sẽ rất rồi bị #duplicate nhiều, và trong trường hợp cần gửi nhận sẽ hàng nghìn hàng triệu user thì mọi thứ sẽ trở nên mất kiểm soát. Khi có #Mediator, mọi thứ sẽ đơn giản hơn rất nhiều.

public class NetworkUser implements User {
        public void sendMessage(String message, String to) {
        print(name + " sent to: " + to + " message: " + message);
        chatRoom.sendMessage(message, name, to);
    }

    public void onMessageReceived(String message, String from) {
        print(name + " received from: " + from + " message: " + message);
    }
}

public static class ChatRoom {

    public void sendMessage(String message, String from, String to) {
        User toUser = users.get(to);
        toUser.onMessageReceived(message, from);
    }
}

Tổng kết

Mediator là một design pattern rất quan trọng, được sử dụng rộng rãi từ server cho đến client, nó giúp loại bỏ việc liên kết chặt chẽ giữa các lớp với nhau từ đó cho phép chúng ta dễ dàng mở rộng hệ thống của mình.

Tham khảo

  1. Wiki
  2. Ví dụ trong bài
Share: