Modello di design Mediatore in Java

Il design pattern Mediator è uno dei design pattern comportamentali, quindi si occupa dei comportamenti degli oggetti. Il design pattern Mediator viene utilizzato per fornire un mezzo di comunicazione centralizzato tra diversi oggetti in un sistema.

Design Pattern Mediator

Secondo GoF, l’intento del pattern Mediator è:

Consente un accoppiamento debole incapsulando il modo in cui insiemi disparati di oggetti interagiscono e comunicano tra loro. Consente alle azioni di ciascun insieme di oggetti di variare indipendentemente l’una dall’altra.

Il design pattern del Mediatore è molto utile in un’applicazione aziendale in cui interagiscono più oggetti. Se gli oggetti interagiscono direttamente tra loro, i componenti del sistema sono strettamente accoppiati tra loro, il che comporta costi di manutenzione più elevati e non è facile da estendere. Il pattern Mediatore si concentra sulla fornitura di un mediatore tra gli oggetti per la comunicazione e aiuta nell’implementazione di un accoppiamento lento tra gli oggetti. Il controllore del traffico aereo è un ottimo esempio di pattern del mediatore in cui la sala di controllo dell’aeroporto funge da mediatore per la comunicazione tra i diversi voli. Il Mediatore funziona come un router tra gli oggetti e può avere la propria logica per fornire un modo di comunicazione. Gli oggetti del sistema che comunicano tra loro sono chiamati Colleghi. Di solito abbiamo un’interfaccia o una classe astratta che fornisce il contratto per la comunicazione e poi abbiamo l’implementazione concreta dei mediatori. Per il nostro esempio, proveremo a implementare un’applicazione di chat in cui gli utenti possono fare chat di gruppo. Ogni utente sarà identificato dal proprio nome e possono inviare e ricevere messaggi. Il messaggio inviato da qualsiasi utente dovrebbe essere ricevuto da tutti gli altri utenti nel gruppo.

Interfaccia del Pattern del Mediatore

Prima di tutto creeremo l’interfaccia del Mediatore che definirà il contratto per i mediatori concreti. ChatMediator.java

package com.journaldev.design.mediator;

public interface ChatMediator {

	public void sendMessage(String msg, User user);

	void addUser(User user);
}

Interfaccia del Pattern Mediatore per i Colleghi

Gli utenti possono inviare e ricevere messaggi, quindi possiamo avere un’interfaccia Utente o una classe astratta. Sto creando l’utente come classe astratta come segue. 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);
}

Nota che l’Utente ha un riferimento all’oggetto mediatore, è necessario per la comunicazione tra utenti diversi.

Mediatore Concreto

Ora creeremo una classe mediatore concreta, avrà una lista di utenti nel gruppo e fornirà la logica per la comunicazione tra gli utenti. ChatMediatorImpl.java

package com.journaldev.design.mediator;

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

public class ChatMediatorImpl implements ChatMediator {

	private List 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){
			// Il messaggio non dovrebbe essere ricevuto dall'utente che lo invia
			if(u != user){
				u.receive(msg);
			}
		}
	}

}

Pattern di Progettazione Mediatore Colleghi Concreti

Ora possiamo creare classi Utente concrete da utilizzare dal sistema client. 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);
	}

}

Nota che il metodo send() sta utilizzando il mediatore per inviare il messaggio agli utenti e non ha idea di come verrà gestito dal mediatore.

Esempio di Codice del Programma Client del Pattern Mediatore

Testiamo questa nostra applicazione di chat con un programma semplice dove creeremo un mediatore e aggiungeremo utenti al gruppo e uno degli utenti invierà un messaggio. 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");
		
	}

}

Nota che il programma client è molto semplice e non ha idea di come il messaggio venga gestito e se il mediatore sta ottenendo l’utente o meno. L’output dell’esempio di programma del pattern mediatore è:

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

Diagramma delle Classi del Pattern Mediatore

Esempio del Pattern Mediatore in JDK

Punti importanti del design pattern Mediator

  • Il pattern Mediator è utile quando la logica di comunicazione tra gli oggetti è complessa, possiamo avere un punto centrale di comunicazione che si occupa della logica di comunicazione.
  • Il servizio di messaggistica Java (JMS) utilizza il pattern Mediator insieme al pattern Observer per consentire alle applicazioni di sottoscriversi e pubblicare dati ad altre applicazioni.
  • Non dovremmo utilizzare il pattern Mediator solo per ottenere un accoppiamento scarso perché se il numero di mediatori aumenterà, diventerà difficile mantenerli.

E questo è tutto per il design pattern Mediator e la sua implementazione in Java.

Source:
https://www.digitalocean.com/community/tutorials/mediator-design-pattern-java