Wzorzec Mediator należy do wzorców behawioralnych, 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.
Comments are closed