Mediator (ang. Mediator) (wzorzec behawioralny) ma za zadanie ułatwić i usprawnić komunikacje między grupą obiektów przy jednoczesnym zmniejszeniu zależności między klasami i ich instancjami. Obiekty kolegów Colleague rejestrują się do Mediatora. Mediator przechowuje referencje do grupy kolegów - obiektów zainteresowanych komunikacją. Gdy dany kolega nadaje komunikator to mediator decyduje o tym do kogo z grupy kolegów ma on trafić. Koledzy nie mają zatem wiedzy o innych obiektach, a całą logiką komunikacji zajmuje się Mediator. Można powiedzieć, że Mediator jest pośrednikiem między rozmówcami.
Ograniczenia
W dużych projektach klasy Mediatorów mogą stać się zbyt złożone. Istnieje ryzyko, że klasa Mediatora stanie się super klasą (god object). Ponadto przy niejednoznacznej implementacji nadany komunikat może być niejasny. Może zajść potrzeba użycia instrukcji warunkowych oraz opakowania danych w klasę wrapper co utrudnia modyfikację i rozszerzalność. Jeśli obiekt Mediatora jest także odbiorcą komunikatów kolegów wówczas może dojść do zapętlenia. Z uwagi na to, że każdy komunikat musi przejść przez Mediatora, można odnotować spadek wydajności systemu.
Użycie
Mediator stosowany jest tam gdzie wiele obiektów o wspólnym interfejsie musi komunikować się między sobą, a przechowywanie referencji we wszystkich obiektach staje się zbyt kosztowne.
Implementacja
Konkretny mediator ConcreteMediator implementuje interfejs Mediator oraz przechowuje grupe obiektów zainteresowanych komunikacją. Może przechowywać je w kolekcji czy też jako pola, jednak to drugie rozwiązanie ogranicza Mediator do komunikacji dla zdefiniowanej liczby i nierzadko typów obiektów przez co jego użycie jest ściśle zdefiniowane. Mediator rozsyła komunikacje na podstawie typów klas, pól obiektów kolegów oraz informacji o tym kto jest nadawcą. Obiekty kolegów rozszerzają klasę Colleague i przechowują referencje do Mediatora. Referencja może być ustawiana w konstruktorze (wymagana jest wtedy znajomość mediatora przed stworzeniem obiektu) lub przez Mediator w trakcie rejestracji obiektu Colleague.
Poniższy listing przedstawia implementacje Mediatora oraz klas kolegów zainteresowanych komunikacją.
Rejestracja i komunikacja między obiektami odbywa się w następujący sposób.
Przykład
Aplikacja Chat umożliwia komunikację między użytkownikami User. Wiadomości trafiają do Chat managera, który na podstawie zawartych metadanych, rozsyła wiadomość do docelowych odbiorców. Konto moderatora Admin, służy właścicielowi aplikacji do komunikacji z użytkownikami za pomocą wiadomości “do wszystkich”. Poniższy listing przedstawia implementację aplikacji z wykorzystaniem wzorca Mediator.
Klient tworzy manager Chat i dołącza do niego pojawiających się użytkowników.
Biblioteki
Strategia implementacji Mediatora jest podejmowana podstawie danej sytuacji. Może być ograniczona do sztywno zdefiniowanych obiektów wewnątrz Mediatora lub przyjmować postać bardziej ogólną dostępną dla większej ilości obiektów. Ponadto rozsyłanie komunikacji również zmienia się w zależności od przyjętej strategii. W związku z tym nie używa się zewnętrznych bibliotek implementujących wzorzec Mediator. Przykładem implementacji wzorca Mediator w Javie może być klasa Timer czy też Executor.