Mediator

1 minute read

Behawioralny wzorzec który wprowadza specjalny obiekt odpowiedzialny za zarządzanie interakcją różnych komponentów między sobą. Stosując takie rozwiązanie pozbywamy się bezpośrednich zależności między komponentami, ich jedyną zależnością będzie obiekt mediator.

Jeśli część obiektów w twojej aplikacji tworzy sieć chaotycznych zależności to taka grupa jest idealnym kandydatem do zastosowania wzorca mediator. Ograniczy on bezpośrednią komunikacje tych obiektów między sobą i zmusi do współpracy z wykorzystaniem pojedyńczego obiektu oraz ustalonego protokołu wymiany informacji.

Sposób implementacji:

  1. Określ grupe bezpośrednio zależnych od siebie klas które skorzystały by na zmniejszeniu ilości powiązań, np.: dla łatwiejszej reużywalności.
  2. Stwórz interfejs mediatora który będzie opisywał metode komunikacji z komponentami.
  3. Zaimplementuj klase mediator. Będzie ona przechowywać referencje do wszystkich powiązanych komponentów i przekazywać wiadomości miedzy nimi.
  4. Mediator może nawet zarządać cyklem życia tych komponentów, czyli tworzyć i usuwać ich obiekty wg. potrzeb.
  5. Komponenty powinny przechowywać referencje do mediatora, prawdopodobnie będzie ona tworzona przez przekazanie obiektu mediator jako argument konstruktora.
  6. Zmień kod komponentów tak by wykorzystywały metode komunikacji przez obiekt mediator zamiast bezpośrednich wywołań na pozostałych komponentach. Z każdego komponentu wydziel kod który odwoływał się do innych i przenieś go do obiektu mediator. Wykonuj go gdy dany komponent powiadomi mediator o takiej potrzebie.

Zalety i wady:

  • Single Responsibility Principle - mediator zachowuje jedną odpowiedzialność
  • Open/Closed Principle - w innej części aplikacji możemy wprowadzić nowy obiekt mediator, bez naruszenia poprzedniego kodu
  • Low coupling - Zmniejszamy ilość bezpośrednich powiązań między komponentami aplikacji
  • Ułatwiamy sposób na ponowne użycie pojedyńczych komponentów w innym miejscu
  • Z czasem mediator może przekształcić się w God Object

Przykładowy kod: GitHub

Polecam źródło Refactoring Guru: Mediator - zawiera długi opis wzorca ze świetnymi przykładami z życia, ilustracjami, diagramami klas i pseudo kodem. Znajdziesz tam również implementacje w różnych językach i opis powiązań z innymi wzorcami.