Wzorzec Mediator należy do wzorców strukturalnych, jest często wykorzystywany by zrównoważyć lub dyskretnie modyfikować przepływ danych pomiędzy obiektami, także by stworzyć warstwę bezpieczeństwa pomiędzy dwoma obiektami w programowaniu zorientowanym obiektowo kontrolując zasady dostępu, albo także w zarządzaniu transakcjami. Z tego powodu jest podobny do wzorca Proxy, jednak tutaj występuje rozgraniczenie wertykalne w logice programu, podczas gdy Proxy kojarzony jest raczej z rozgraniczeniem horyzontalnym (warstwowym). Użycie Mediatora “wymusza” na obiektach zaprzestanie bezpośredniej komunikacji i prowadzenie jej wyłącznie poprzez obiekt Mediatora.

Po co Ci on?

Klasycznym chyba już przykładem zastosowania tego wzorca jest sytuacja kontrolera lotów na lotnisku. Gdyby piloci samolotów w pobliżu lotniska komunikowali się samodzielnie pomiędzy sobą to powodowałoby to niesamowity chaos i brak bezpieczeństwa. Każdy pilot musiałby bowiem wiedzieć o każdym innym uczestniku lotu, brać ich pod uwagę w podejmowaniu decyzji, wzajemnie musieli by określać priorytety, kto ląduje pierwszy, kto ma pozostać w powietrzu. Zamiast tego wieża kontroli lotów obejmuje nadzór nad wszystkimi uczestnikami kolejkując potrzeby pilotów.

Jak się podpiąć?

Wpierw możemy skonstruować podstawę naszego Mediatora w postaci definicji wspólnego komunikatu:

package wzorceprojektowe;

class flightMessage {
  public String message;
  public String recepient;

  public flightMessage( String recepient, String message ) {
    this.recepient = recepient;
    this.message = message;
  }
}

Teraz już mając zaczątek możemy skonstruować klasę opisującą nasz obiekt i posiadającą metodę umożliwiającą otrzymanie komunikatu.

class Flight {
  String name;
  public Flight( String name ) { this.name=name; }

  public void receive( flightMessage message ) {
    System.out.println( "Treść: " + message.message );
  }
}

Nadszedł już czas aby zainstalować Mediatora dla naszych obiektów…

class Mediator {
  Flight [] flights;
  public Mediator( Flight [] flights ) { this.flights=flights; }

  
  public boolean send( flightMessage message ) {
          for(Flight fl:flights) if (message.recepient==fl.name) { 
                    fl.receive(message);
                    return true;
                                                                 }
           System.err.println("Błąd: Nieznany odbiorca");
           return false;
          
  }

Na koniec pozostało już tylko pokazać jak użyć powyższej struktury…

public static void main(String[] args) {
  
Flight flight001 = new Flight( "CEW345" );
Flight flight002 = new Flight( "RET456" );
Flight flight003 = new Flight( "NNW9898" );

Flight flights [] = {flight001,flight002,flight003};

Mediator mediator = new Mediator( flights );
flightMessage mns=new flightMessage("CEW345","Cześć CEW345"); 
mediator.send(mns);

mns=new flightMessage("RET456","Miej dobry dzień...");
mediator.send( mns );
}           

Zadanie: Przygotuj program obsługi prostego komunikatora.

Pokaż jak działa prowadzenie rozmowy pomiędzy kilkoma użytkownikami z wykorzystaniem “the application center of gravity focal point”.

W zadaniu rozważ temat, gdy dwu uczestników, inżynierów rozmawia o wymiarach elementów projektu, podczas gdy jeden z nich żyje w świecie metrycznym, a drugi w imperialnym…1W jednym wypadku “szczegół” braku porozumienia kosztował NASA 125 mln dol. W październiku 1999 r. amerykańska agencja kosmiczna straciła sondę Mars Climate Orbiter, ponieważ dwa zespoły projektujących ją naukowców używały różnych systemów miar. Inżynierowie z Jet Propulsion Laboratory (JPL) w Kalifornii korzystali z systemu metrycznego, podczas gdy Lockheed Martin Astronautics w Denver w stanie Colorado, które zaprojektowało i zbudowało bezzałogowy pojazd, używało systemu brytyjskiego – cali, stóp i funtów. Zaproponuj w rozwiązaniu rozróżnienie użytkowników w zależności od używanego systemu miar i automatyczną translację podawanych wymiarów.