Mediator Pattern

Mediator  pattern là pattern cho phép giảm việc coupling bằng việc đóng gói cách giao tiếp của tập các objects khác nhau tưởng tác, giao tiếp với nhau.

Ta sử dụng Mediator khi giao tiếp giữa các objects trong hệ thống quá phức tạp, có quá nhiều quan hệ giữa các objects trong hệ thống.

Các bước xây dựng Mediator:

  • Xây dựng 1 class riêng đóng vài trò Mediator gom các tương tác giữ các class lại
  • Các class khác ủy quyền các thao tác đến Mediator và không có thao tác trựa tiếp

Sơ đồ minh họa:

Mediator được sử dụng cũng khá nhiều. Thường được thấy ở các ứng dụng liên quan đến chat như Facebook hay Java Message Service.

Một ví dụ minh họa về Mediator.

Trong một ứng dụng chát, một cá nhân sẽ có thể send và recieve message. Khi một người muốn send message đến group thì người đó phải tìm xem tất cả những người đang online hoặc trong trạng thái có thể message để send. Nếu bình thường người gửi tin phải tự làm hết mọi thứ, phải tự kiểm tra từ cá nhân và thực hiện việc gửi tin nhắn.

Khi sử dụng Mediator: cá nhân không cần tự kiểm tra, quan tâm ai có thể nhận message mà gửi. cá nhân chỉ việc gửi thông tin đến Mediator của group. Mediator sẽ tự điều phối message này đến người nhận.

public interface Mediator {
  public void send(String message, Colleague colleague);
}
//Colleage interface
public abstract Colleague{
  private Mediator mediator;
  public Colleague(Mediator m) {
    mediator = m;
  }
  //send a message via the mediator
  public void send(String message) {
    mediator.send(message, this);
  }
  //get access to the mediator
  public Mediator getMediator() {return mediator;}
  public abstract void receive(String message);
}
public class ApplicationMediator implements Mediator {
  private ArrayList<Colleague> colleagues;
  public ApplicationMediator() {
    colleagues = new ArrayList<Colleague>();
  }
  public void addColleague(Colleague colleague) {
    colleagues.add(colleague);
  }
  public void send(String message, Colleague originator) {
    //let all other screens know that this screen has changed
    for(Colleague colleague: colleagues) {
      //don't tell ourselves
      if(colleague != originator) {
        colleage.receive(message);
      }
    }
  }
}
public class ConcreteColleague extends Colleague {
  public void receive(String message) {
    System.out.println("Colleague Received: " + message);
  }
}
public class MobileColleague extends Colleague {
  public void receive(String message) {
    System.out.println("Mobile Received: " + message);
  }
}
public class Client {
  public static void main(String[] args) {
    ApplicationMediator mediator = new ApplicationMediator();
    ConcreteColleague desktop = new ConcreteColleague(mediator);
    ConcreteColleague mobile = new MobileColleague(mediator);
    mediator.addColleague(desktop);
    mediator.addColleague(mobile);
    desktop.send("Hello World");
    mobile.send("Hello");
  }
}

Ví dụ minh họa trích dzone