Trang chủHướng dẫnMediator Design Pattern trong Java
Java

Mediator Design Pattern trong Java

CyStack blog 4 phút để đọc
CyStack blog04/09/2025
Locker Avatar

Bao Tran

Web Developer

Locker logo social
Reading Time: 4 minutes

Mediator design pattern trong Java là một trong các behavioral design pattern (mẫu thiết kế hành vi), vì vậy nó liên quan đến hành vi của các đối tượng. Mediator design pattern được sử dụng để cung cấp một phương tiện giao tiếp tập trung giữa các đối tượng khác nhau trong hệ thống.

Mediator Design Pattern trong Java

Theo định nghĩa của GoF, mục đích của mediator pattern là: Cho phép loose coupling bằng cách đóng gói cách các tập hợp đối tượng khác nhau tương tác và giao tiếp với nhau. Điều này giúp hành vi của từng nhóm đối tượng có thể thay đổi độc lập với nhau.

Mediator design pattern rất hữu ích trong các ứng dụng doanh nghiệp, nơi nhiều đối tượng tương tác với nhau. Nếu các đối tượng tương tác trực tiếp, các thành phần của hệ thống sẽ bị ràng buộc chặt chẽ với nhau, dẫn đến chi phí bảo trì cao hơn và khó mở rộng.

Mediator pattern tập trung vào việc cung cấp một đối tượng trung gian (mediator) để các đối tượng giao tiếp với nhau, giúp triển khai lose-coupling giữa chúng. Một ví dụ điển hình về Mediator pattern là hệ thống kiểm soát không lưu. Trong đó, phòng điều khiển sân bay đóng vai trò như một mediator để giao tiếp giữa các chuyến bay khác nhau.

Mediator hoạt động như một bộ định tuyến giữa các đối tượng và có thể có logic riêng để cung cấp cách giao tiếp. Các đối tượng của hệ thống giao tiếp với nhau được gọi là Colleagues. Thông thường, chúng ta có một interface hoặc abstract class làm hợp đồng giao tiếp, sau đó có các triển khai cụ thể của mediators. Đối với ví dụ này, chúng ta sẽ thử triển khai một ứng dụng trò chuyện nơi người dùng có thể trò chuyện nhóm . Mỗi người dùng sẽ được xác định bằng tên và họ có thể gửi và nhận tin nhắn. Tin nhắn được gửi bởi bất kỳ người dùng nào cũng phải được nhận bởi tất cả những người dùng khác trong nhóm.

Giao diện của Mediator Pattern

Đầu tiên, chúng ta sẽ tạo một interface Mediator để định nghĩa hợp đồng cho các concrete mediators. Đây là file ChatMediator.java.

package com.journaldev.design.mediator;

public interface ChatMediator {

	public void sendMessage(String msg, User user);

	void addUser(User user);
}

Giao diện Colleague của Mediator Pattern

Người dùng có thể gửi và nhận tin nhắn, vì vậy chúng ta có thể tạo một giao diện User hoặc abstract class. Dưới đây, tôi sẽ tạo User dưới dạng một abstract class trong file User.java.

package com.journaldev.design.mediator;

public abstract class User {
	protected ChatMediator mediator;
	protected String name;

	public User(ChatMediator med, String name){
		this.mediator=med;
		this.name=name;
	}

	public abstract void send(String msg);

	public abstract void receive(String msg);
}

Cần lưu ý rằng User có một tham chiếu đến đối tượng mediator, điều này là cần thiết cho việc giao tiếp giữa những người dùng khác nhau.

Concrete Mediator

Bây giờ, chúng ta sẽ tạo lớp concrete mediator, nó sẽ chứa danh sách người dùng trong nhóm và cung cấp logic để giao tiếp giữa họ. Đây là file ChatMediatorImpl.java.

package com.journaldev.design.mediator;

import java.util.ArrayList;
import java.util.List;

public class ChatMediatorImpl implements ChatMediator {

	private List<User> users;

	public ChatMediatorImpl(){
		this.users=new ArrayList<>();
	}

	@Override
	public void addUser(User user){
		this.users.add(user);
	}

	@Override
	public void sendMessage(String msg, User user) {
		for(User u : this.users){
			//message should not be received by the user sending it
			if(u != user){
				u.receive(msg);
			}
		}
	}

}

Concrete Colleague trong Mediator Pattern

Bây giờ, chúng ta có thể tạo các lớp concrete User để hệ thống client sử dụng. Đây là file UserImpl.java.

package com.journaldev.design.mediator;

public class UserImpl extends User {

	public UserImpl(ChatMediator med, String name) {
		super(med, name);
	}

	@Override
	public void send(String msg){
		System.out.println(this.name+": Sending Message="+msg);
		mediator.sendMessage(msg, this);
	}
	@Override
	public void receive(String msg) {
		System.out.println(this.name+": Received Message:"+msg);
	}

}

Hãy chú ý rằng phương thức send() đang sử dụng mediator để gửi tin nhắn đến những người dùng khác và nó hoàn toàn không biết mediator sẽ xử lý tin nhắn đó như thế nào.

Code chương trình client ví dụ về Mediator Pattern

Bây giờ, chúng ta hãy kiểm tra ứng dụng trò chuyện này bằng một chương trình đơn giản, trong đó chúng ta sẽ tạo mediator, thêm người dùng vào nhóm và một trong số họ sẽ gửi tin nhắn. Đây là file ChatClient.java.

package com.journaldev.design.mediator;

public class ChatClient {

	public static void main(String[] args) {
		ChatMediator mediator = new ChatMediatorImpl();
		User user1 = new UserImpl(mediator, "Pankaj");
		User user2 = new UserImpl(mediator, "Lisa");
		User user3 = new UserImpl(mediator, "Saurabh");
		User user4 = new UserImpl(mediator, "David");
		mediator.addUser(user1);
		mediator.addUser(user2);
		mediator.addUser(user3);
		mediator.addUser(user4);

		user1.send("Hi All");

	}

}

Lưu ý rằng chương trình client rất đơn giản và nó không biết tin nhắn được xử lý như thế nào hay liệu mediator có nhận được người dùng hay không. Dưới đây là kết quả của chương trình ví dụ về Mediator pattern:

Pankaj: Sending Message=Hi All
Lisa: Received Message:Hi All
Saurabh: Received Message:Hi All
David: Received Message:Hi All

Biểu đồ lớp của Mediator Pattern:

mediator pattern

Các ví dụ về Mediator Pattern trong JDK

  • Các phương thức scheduleXXX() của lớp java.util.Timer.
  • Phương thức execute() của Java Concurrency Executor.
  • Phương thức invoke() của java.lang.reflect.Method.

Những điểm quan trọng của Mediator Design Pattern

  • Mediator pattern hữu ích khi logic giao tiếp giữa các đối tượng trở nên phức tạp. Chúng ta có thể có một điểm giao tiếp trung tâm để xử lý logic này.
  • Java Message Service (JMS) sử dụng Mediator pattern cùng với Observer pattern để cho phép các ứng dụng đăng ký và xuất bản dữ liệu cho các ứng dụng khác.
  • Chúng ta không nên sử dụng Mediator pattern chỉ để đạt được lose-coupling, bởi vì nếu số lượng mediators tăng lên, việc bảo trì chúng sẽ trở nên khó khăn.

Đó là tất cả về Mediator design pattern và cách triển khai nó trong Java.

0 Bình luận

Đăng nhập để thảo luận

Chuyên mục Hướng dẫn

Tổng hợp các bài viết hướng dẫn, nghiên cứu và phân tích chi tiết về kỹ thuật, các xu hướng công nghệ mới nhất dành cho lập trình viên.

Đăng ký nhận bản tin của chúng tôi

Hãy trở thành người nhận được các nội dung hữu ích của CyStack sớm nhất

Xem chính sách của chúng tôi Chính sách bảo mật.

Đăng ký nhận Newsletter

Nhận các nội dung hữu ích mới nhất