Mediator

Definition


Define an object that encapsulates how a set of objects interact. Mediator promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction independently.

UML class diagram


Participants


  • Mediator
    • defines an interface for communicating with Colleague objects
  • ConcreteMediator
    • implements cooperative behavior by coordinating Colleague objects
    • knows and maintains its colleagues
  • Colleague classes
    • each Colleague class knows its Mediator object
    • each colleague communicates with its mediator whenever it would have otherwise communicated with another colleague

Sample code in Java

package com.hong.mediator;

abstract class Colleague {
    protected Mediator mediator;
    public Colleague(Mediator mediator){
        this.mediator = mediator;
    }
}
class ConcreteColleagueA extends Colleague{

    public ConcreteColleagueA(Mediator mediator) {
        super(mediator);
    }

    public void send(String message){
        this.mediator.send(message, this);
    }
    
    public void display(String message){
        
        System.out.println("ColleaugeA sending message: " + message);
    }
}

class ConcreteColleagueB extends Colleague{
    
    public ConcreteColleagueB(Mediator mediator) {
        super(mediator);
    }

    public void send(String message){
        this.mediator.send(message, this);
    }
    
    public void display(String message){
        System.out.println("ColleaugeB sending message: " + message);
    }
}

interface Mediator {
    public void send(String message, Colleague colleague);
}
class ConcreteMediator implements Mediator {

    
    private ConcreteColleagueA colleagueA; 
    private ConcreteColleagueB colleagueB;
    @Override
    public void send(String message, Colleague colleague) {

        if(colleague instanceof ConcreteColleagueA  ) {
            
            colleagueA.display(message);
        }
        else {
            colleagueB.display(message);
        }
    }
    
    public ConcreteColleagueA getColleagueA() {
        return colleagueA;
    }
    
    public void setColleagueA(ConcreteColleagueA colleagueA) {
        this.colleagueA = colleagueA;
    }
    
    public Colleague getColleagueB() {
        return colleagueB;
    }
    public void setColleagueB(ConcreteColleagueB colleagueB) {
        this.colleagueB = colleagueB;
    }
}

public class Mediator_structure {
    
    public static void main(String[] args) {
        
          ConcreteMediator mediator = new ConcreteMediator();
          ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator);
          ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator);
          
          mediator.setColleagueA(colleagueA);
          mediator.setColleagueB(colleagueB);
          
          colleagueA.send("Hello");
          colleagueB.send("World");
    }
}