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.