Mediator pattern - kiedy porządkuje chaos, a kiedy szkodzi?

Schemat mediacji sądowych: spór, sąd, lista mediatorów, wybór mediatora, proces mediacji. Działa jak mediator pattern.

Napisano przez

Alex Jabłoński

Opublikowano

19 mar 2026

Spis treści

W aplikacjach webowych najwięcej problemów nie robią pojedyncze klasy, tylko ich wzajemne zależności. Mediator pattern pomaga wtedy, gdy obiekty zaczynają komunikować się ze sobą zbyt gęsto, a każda zmiana jednej części pociąga za sobą poprawki w kilku innych miejscach. W tym tekście pokazuję, jak ten wzorzec działa, kiedy naprawdę ma sens i jak go odróżnić od podobnych rozwiązań, żeby nie dodać do projektu kolejnej warstwy bez korzyści.

Najkrócej: Mediator porządkuje komunikację i ogranicza chaos zależności

  • Wzorzec przenosi decyzję o tym, kto z kim i kiedy rozmawia, do jednego obiektu pośredniczącego.
  • Najbardziej pomaga tam, gdzie obiekty zaczynają się nawzajem znać zbyt dobrze: formularze, panele administracyjne, pipeline komend, logika UI.
  • Jego siłą jest mniejsza liczba zależności i prostsze testy, ale ceną bywa dodatkowa warstwa i ryzyko „przerośniętego” mediatora.
  • W aplikacjach webowych często działa najlepiej jako koordynator, a nie miejsce na całą logikę biznesową.
  • Najlepiej sprawdza się przy wielu regułach interakcji; przy prostych przepływach bywa zbędny.

Czym jest wzorzec Mediator i jaki problem rozwiązuje

To wzorzec behawioralny, w którym jeden obiekt przejmuje rolę koordynatora interakcji między wieloma innymi obiektami. Ja najczęściej tłumaczę go sobie bardzo praktycznie: zamiast sieci bezpośrednich wywołań dostajesz jedno miejsce, które wie, jak poprowadzić przepływ. Gdy masz 5 komponentów, liczba potencjalnych relacji robi się już zauważalna, a przy 8 elementach dochodzisz do 28 par połączeń. To nie jest matematyka dla ozdoby, tylko ilustracja tego, jak szybko kod zaczyna się rozlewać.

Mediator nie służy do wykonywania całej pracy za obiekty. Jego zadanie jest skromniejsze i ważniejsze: decydować, kto ma zareagować i w jakiej kolejności, a same komponenty zostawić możliwie proste. Dzięki temu łatwiej je testować, wymieniać i ponownie wykorzystywać. Kiedy ten obraz jest już jasny, warto zobaczyć, jak wygląda przepływ komunikacji krok po kroku.

Schemat przepływu zapisu w mikroserwisie z użyciem wzorca mediator pattern. Komendy przechodzą przez kontroler, mediator, handler do agregatów i repozytorium.

Jak działa komunikacja przez pośrednika

W praktyce mediator opiera się na trzech rolach. Pierwsza to obiekty robocze, czyli komponenty, które wykonują własne zadania. Druga to sam mediator, który zbiera sygnały i uruchamia właściwe reakcje. Trzecia to konkretna implementacja mediatora, która zna reguły współpracy, ale nie musi znać szczegółów wszystkich klas w taki sposób, w jaki znają się one nawzajem w układzie bez pośrednika.

Element Rola Co to daje
Komponenty Wykonują lokalne zadania i zgłaszają zmiany Nie muszą znać szczegółów innych obiektów
Mediator Koordynuje komunikację i wybiera reakcję Porządkuje przepływ i zmniejsza liczbę zależności
Konkretna implementacja Zawiera reguły współpracy dla danego przypadku Można zmienić logikę interakcji bez przepisywania wszystkich komponentów
  1. Jeden komponent zgłasza zmianę stanu albo potrzebę działania.
  2. Mediator sprawdza kontekst i decyduje, które obiekty powinny zareagować.
  3. Wybrane komponenty dostają polecenie albo informację zwrotną.
  4. Komponenty nadal nie rozmawiają ze sobą bezpośrednio, więc ich zależności pozostają płytsze.

W dokumentacji Microsoft Learn ten układ pojawia się w aplikacjach ASP.NET Core: kontroler wysyła komendę do mediatora, a handler wykonuje właściwą pracę. To dobry przykład, bo pokazuje mediator nie jako teorię z książki, ale jako sposób na uproszczenie realnego przepływu w aplikacji. Żeby to nie zostało na poziomie schematu, spójrzmy na formularz, bo tam ten wzorzec widać najszybciej.

Przykład z formularza, który sam ustala reguły

W formularzu rejestracji albo ustawień zależności pojawiają się błyskawicznie. Checkbox „konto firmowe” odsłania pole NIP, wybór kraju zmienia walidację kodu pocztowego, a przycisk „Zapisz” aktywuje się dopiero wtedy, gdy spełnione są wszystkie warunki. Gdyby każda kontrolka znała resztę, logika rozrosłaby się w mały labirynt.

Zdarzenie Reakcja mediatora Efekt dla użytkownika
Zaznaczono „konto firmowe” Pokazuje pole NIP i uruchamia dodatkową walidację Formularz reaguje na kontekst, a nie tylko na pojedyncze pole
Zmieniono kraj Podmienia maskę kodu pocztowego i zestaw reguł adresowych Mniej błędów wejściowych i mniej komunikatów po wysłaniu formularza
Hasło ma zbyt mało znaków Blokuje zapis i pokazuje właściwy komunikat Użytkownik od razu widzi, co trzeba poprawić

Ja w takich przypadkach wolę, aby mediator był cienką warstwą koordynacji, a reguły walidacji trafiały do osobnych walidatorów. Dzięki temu formularz pozostaje czytelny, a zmiana jednego warunku nie wymaga grzebania w kilku kontrolkach naraz. To prowadzi do najważniejszego praktycznego pytania: kiedy ten wzorzec rzeczywiście warto dodać, a kiedy tylko powiększy kod?

Kiedy warto go stosować, a kiedy lepiej odpuścić

Ja sięgam po Mediatora wtedy, gdy zależności rosną szybciej niż sama funkcjonalność. To zwykle oznacza kilka lub kilkanaście obiektów, które zaczynają się wzajemnie obserwować, warunkować i blokować. Wtedy centralny pośrednik przestaje być ozdobą architektoniczną, a zaczyna realnie oszczędzać czas.

  • Stosuj go, gdy liczba relacji między komponentami rośnie wraz z rozwojem funkcji.
  • Stosuj go, gdy reguły współpracy zmieniają się częściej niż same komponenty.
  • Stosuj go, gdy chcesz centralnie ogarnąć walidację, logowanie, audyt albo autoryzację przepływu.
  • Stosuj go, gdy budujesz UI z wieloma współzależnymi kontrolkami albo command pipeline po stronie backendu.
  • Nie stosuj go, gdy interakcja jest prosta i obejmuje 2-3 klasy.
  • Nie stosuj go, gdy pośrednik zaczyna przejmować biznesowe decyzje i zamienia się w God Object.
  • Nie stosuj go, gdy masz lepszy model komunikacji zdarzeniowej lub wyraźne granice komponentów.
  • Nie stosuj go, gdy koszt dodatkowej abstrakcji jest większy niż zysk z uporządkowania zależności.

W praktyce zbyt wczesne wprowadzenie wzorca potrafi zaszkodzić bardziej niż jego brak. Jeśli przepływ jest prosty, proste wywołanie zwykle wygrywa. Gdy jednak rośnie liczba reguł i wyjątków, mediator zaczyna zwracać inwestycję bardzo szybko. Następny krok to odróżnienie go od kilku podobnych mechanizmów, bo tu najłatwiej o mylne decyzje.

Mediator, Observer, Facade i event bus w praktyce

Te wzorce bywają wrzucane do jednego worka, ale rozwiązują różne problemy. Ja patrzę na nie tak: Mediator porządkuje współpracę między równorzędnymi obiektami, Observer rozsyła informację o zmianie stanu, Facade upraszcza dostęp do złożonego subsystemu, a event bus daje luźniejsze, zdarzeniowe połączenie między nadawcami i odbiorcami.

Wzorzec Główna rola Kiedy pasuje najlepiej
Mediator Koordynuje interakcje między obiektami Gdy wiele komponentów wpływa na siebie nawzajem
Observer Powiadamia zainteresowanych o zmianie stanu Gdy jeden obiekt ma wielu odbiorców reakcji
Facade Ukrywa złożoność pod prostym interfejsem Gdy chcesz uprościć korzystanie z subsystemu
Event bus Przekazuje zdarzenia między producentami i konsumentami Gdy komunikacja ma być bardziej pośrednia i rozproszona

Jeśli po tej tabeli nadal brzmi to podobnie, zapamiętaj jedną rzecz: Mediator odpowiada na pytanie „kto z kim i kiedy współpracuje?”, a nie „jak ukryć bibliotekę” ani „komu wysłać event”. To dobry moment, żeby zobaczyć typowe pułapki implementacyjne, bo one decydują o tym, czy wzorzec realnie pomaga.

Najczęstsze błędy przy wdrażaniu i jak ich uniknąć

  • Zbyt gruby mediator. Jeśli cały biznes ląduje w jednym obiekcie, zyskujesz tylko nowy wąskie gardło. Trzymaj w nim koordynację, nie całą domenę.
  • Mieszanie reguł z transportem. Mediator nie powinien sam liczyć wszystkiego od A do Z. Walidację, transformację i decyzje dziel tam, gdzie mają sens.
  • Wprowadzanie wzorca na siłę. Przy dwóch klasach mediator często jest zbędny. Wtedy prostszy kod wygrywa z elegancką abstrakcją.
  • Brak granic odpowiedzialności. Jeśli nie wiadomo, za co mediator odpowiada, a za co nie, testy szybko stają się kruche. Ja lubię opisać to jednym zdaniem jeszcze przed implementacją.

W .NET i ASP.NET Core ten problem jest dobrze widoczny przy kontrolerach: Microsoft Learn pokazuje, że mediator pomaga odchudzić konstruktor i przekazać pracę handlerom, ale tylko wtedy, gdy sam mediator nie zaczyna być kolejną monolityczną usługą. Gdy zasada „koordynuj, nie duplikuj logiki” jest pilnowana, wzorzec pozostaje czytelny. Zostaje jeszcze ostatnia kwestia: jak ocenić, czy w twoim projekcie to faktycznie się opłaci.

Jak oceniam, czy mediator naprawdę się opłaci w projekcie

Przed wdrożeniem sprawdzam cztery rzeczy: czy zależności rosną szybciej niż sama funkcja, czy interakcje zmieniają się częściej niż komponenty, czy potrzebuję jednego miejsca dla logowania i walidacji, oraz czy pośrednik da się opisać jednym prostym zdaniem. Jeśli na dwa z tych pytań odpowiadam „nie”, zwykle zostawiam prostsze wywołania. Jeśli na trzy odpowiadam „tak”, Mediator zaczyna być rozsądnym wyborem, nie tylko ładnym wzorcem z książki.

W projekcie webowym traktuję go więc jak narzędzie do porządkowania komunikacji, a nie obowiązkowy element architektury. Dobrze użyty upraszcza rozwój i testy; źle użyty przenosi chaos do jednego miejsca. I właśnie ta różnica najczęściej decyduje o tym, czy wzorzec pomaga zespołowi, czy tylko wygląda dojrzale na diagramie.

FAQ - Najczęstsze pytania

Mediator to wzorzec behawioralny, który koordynuje interakcje między wieloma obiektami. Zamiast bezpośrednich połączeń, wprowadza jeden punkt pośredniczący, który decyduje, kto z kim i kiedy ma się komunikować, zmniejszając zależności.

Warto go użyć, gdy liczba zależności między komponentami rośnie (np. w formularzach, panelach administracyjnych), gdy reguły współpracy często się zmieniają, lub gdy potrzebujesz centralnego miejsca do walidacji czy logowania przepływu.

Unikaj go, gdy interakcja jest prosta (2-3 klasy), gdy mediator zaczyna przejmować całą logikę biznesową (stając się "God Object"), lub gdy masz lepsze, luźniejsze modele komunikacji, np. event bus.

Mediator koordynuje współpracę między równorzędnymi obiektami. Observer powiadamia o zmianie stanu, a Event Bus przekazuje zdarzenia w sposób bardziej rozproszony. Mediator odpowiada na pytanie "kto z kim i kiedy współpracuje?".

Główne błędy to tworzenie "zbyt grubego" mediatora (przejmującego logikę), mieszanie reguł z transportem, wprowadzanie wzorca na siłę przy prostych przepływach oraz brak jasnych granic odpowiedzialności.

Oceń artykuł

Ocena: 0.00 Liczba głosów: 0

Tagi:

mediator pattern wzorzec mediator w aplikacjach webowych kiedy stosować wzorzec mediator zalety i wady wzorca mediator

Udostępnij artykuł

Alex Jabłoński

Alex Jabłoński

Nazywam się Alex Jabłoński i od 9 lat zajmuję się programowaniem webowym. Moja przygoda z tą dziedziną zaczęła się od prostych projektów, które z czasem przerodziły się w pasję do tworzenia użytecznych i estetycznych aplikacji internetowych. Fascynuje mnie nie tylko sam proces kodowania, ale także to, jak technologie wpływają na nasze życie i jak możemy je wykorzystać, aby rozwiązywać codzienne problemy. Piszę o różnych aspektach programowania, od podstawowych języków po bardziej zaawansowane techniki i narzędzia. Staram się, aby moje teksty były przystępne i zrozumiałe, a skomplikowane zagadnienia przedstawiam w prosty sposób. Regularnie śledzę nowinki w branży, co pozwala mi dostarczać aktualne i rzetelne informacje. Moim celem jest nie tylko edukacja, ale także inspirowanie innych do rozwijania swoich umiejętności w programowaniu.

Napisz komentarz