Design patterns: Mediator

Mauto 2 min

Il Mediator Pattern è un design pattern comportamentale che definisce un oggetto (il mediatore) incaricato di controllare la comunicazione tra un insieme di oggetti. Invece di consentire agli oggetti di comunicare direttamente tra loro, riducendo così il loro accoppiamento, il mediatore centralizza e gestisce la loro interazione.

Quando Utilizzarlo:

  • Quando hai molti oggetti che interagiscono tra loro e vuoi evitare dipendenze dirette e complesse tra di essi.
  • Quando vuoi semplificare le comunicazioni tra oggetti di un sistema rendendo il codice più gestibile.

Punti di Forza

  1. Riduce il Coupling: Gli oggetti non comunicano direttamente tra loro ma tramite il mediatore, riducendo le dipendenze e semplificando le relazioni tra componenti.
  2. Facilita la Manutenzione: Con meno dipendenze dirette tra gli oggetti, è più facile modificare il comportamento di un singolo componente senza influenzare altri oggetti.
  3. Centralizzazione della Logica di Comunicazione: La logica di comunicazione è centralizzata nel mediatore, consentendo di gestire facilmente le interazioni tra più oggetti.
  4. Incremento della Flessibilità: Permette di cambiare il comportamento delle interazioni tra gli oggetti modificando il mediatore, senza toccare i singoli oggetti.
  5. Supporta la Scomposizione del Problema: Permette di scomporre un sistema complesso in parti più semplici, rendendo l’architettura complessiva più chiara e facile da capire.

Caso d’Uso

Immagina di avere un sistema di chat in cui diversi utenti comunicano tra loro. Invece di permettere agli utenti di inviare messaggi direttamente agli altri, un oggetto ChatRoom funge da mediatore centralizzato.

Codice PHP

// Interfaccia per il Mediatore
interface ChatRoomMediator {
    public function showMessage(User $user, $message);
}

// Concrete Mediator
class ChatRoom implements ChatRoomMediator {
    public function showMessage(User $user, $message) {
        $time = date('Y-m-d H:i:s');
        $sender = $user->getName();
        echo "{$time} [{$sender}]: {$message}\n";
    }
}

// Classe utente
class User {
    private $name;
    private $mediator;

    public function __construct($name, ChatRoomMediator $mediator) {
        $this->name = $name;
        $this->mediator = $mediator;
    }

    public function getName() {
        return $this->name;
    }

    public function sendMessage($message) {
        $this->mediator->showMessage($this, $message);
    }
}

// Utilizzo del Mediatore
$mediator = new ChatRoom();

$user1 = new User("Alice", $mediator);
$user2 = new User("Bob", $mediator);

$user1->sendMessage("Ciao Bob!");
$user2->sendMessage("Ciao Alice! Come stai?");

/* output
2024-09-28 12:34:56 [Alice]: Ciao Bob!
2024-09-28 12:35:00 [Bob]: Ciao Alice! Come stai?
*/

Spiegazione

  • ChatRoomMediator è l’interfaccia che definisce il metodo di comunicazione.
  • ChatRoom è l’implementazione concreta del mediatore, che centralizza la logica di comunicazione.
  • User rappresenta gli oggetti che partecipano alla chat. Gli utenti non comunicano direttamente tra loro, ma inviano messaggi tramite il mediatore (ChatRoom).
  • Il mediatore ChatRoom gestisce la trasmissione dei messaggi tra gli utenti, riducendo il coupling tra loro.

TORNA ALLA GUIDA

content_copy Copiato