Mediator Několik slov o překladu slova do češtiny (prostředník, zprostředkovatel), vyzdvihnutí počeštěného slova mediátor. 1 1
Mediator - motivace Řízení letového provozu Formulář, který všichni známe. Stručné připomenutí toho, jak se prvky vzájemně ovlivňují. 2 2
Mediator - motivace FontDialog závislosti mezi jednotlivými ovládacími prvky jsou netriviální Formulář, který všichni známe. Stručné připomenutí toho, jak se prvky vzájemně ovlivňují. 3 3
Mediator - motivace „Naivní“ přístup každá komponenta obdrží ukazatele na „kolegy“, se kterými komunikuje chování je rozprostřeno mezi jednotlivými komponentami fontEntryField fontListBox styleEntryField styleListbox fontListBox fontEntryField styleEntryField preview Popsat zřejmé nevýhody tohoto řešení – náročná správa, špatná rozšiřitelnost,… styleListBox entryField preview preview 4 4
Mediator - motivace Řešení pomocí Mediatoru každá komponenta obsahuje pouze ukazatel na jeden objekt - mediátor v něm je soustředěno chování celého dialogového okna styleEntryField mediator má přehled o jednotlivých widgetech, koordinuje interakce fontEntryField mediator fontListBox mediator aFontDialogDirector Popsat interakci a výhody tohoto řešení. styleListBox mediator preview 5 5
Mediator - chování Listbox a entry field o sobě vůbec neví čas uživatel změní výběr v listboxu, ten ohlásí změnu mediátorovi, který předá aktuální položku do vstupního políčka Listbox a entry field o sobě vůbec neví o tom, že se má po změně někam něco vyplnit, se rozhoduje v mediátoru Interakce zprostředkovaně přes jeden objekt 6 6
Mediator - struktura rozhraní pro komunikaci kolegů znají pouze svého mediátora veškerou komunikaci směřují na něj implementuje společné chování, zná a koordinuje kolegy 7 7
Mediator - účel Účel Není to proti principům OOP? zapouzdření chování systému objektů Loose coupling umožňuje měnit interakci objektů nezávisle na jejich vnitřní implementaci zjednodušuje program Není to proti principům OOP? distribuce chování mezi jednotlivými objekty je přece většinou vítaná ale jen do té doby, dokud nejde proti znovupoužitelnosti slévání do monolitu Pár slov o spojení „Loose coupling“. Poznámky související se sléváním do monolitu: distribuce chování → velká propojenost jednotlivých objektů propojenost → objekt většinou nemůže pracovat bez ostatních i systém rozdělený na mnoho částí se chová jako monolit změnit chování distribuované do mnoha (stovek) objektů může být obtížné – dědičnost nám moc nepomůže 8 8
Mediator - použití Kdy sáhnout po mediátoru? skupina objektů má komunikovat definovaným, ale složitým způsobem složité závislosti mezi objekty znovupoužití objektu je obtížné spolupracuje s mnoha jinými objekty chování distribuované mezi mnoho objektů bylo mělo být upravitelné bez nutnosti vytváření mnoha podtříd 9 9
Mediator - důsledky Výhody a omezení omezuje odvozování mnoha podtříd původně distribuované chování soustřeďuje na jedno místo ostatní objekty je možné znovu použít odstraňuje nutnost referencí na všechny spolupracující objekty kolegové o sobě navzájem nevědí zabstraktňuje způsob spolupráce objektů odděluje kooperaci mezi objekty od jejich samostatného chování kooperace lze řešit na jednom místě n:m interakce nahrazuje 1:m, které jsou jednodušší k pochopení i rozšiřování centralizuje řízení samotný mediátor bude většinou složitý 10 10
Mediator - implementace varianty - abstraktní x konkrétní komunikace kolega-mediátor při „zajímavé“ události aktivně, když kolega něco potřebuje mediátor propaguje událost k dalším kolegům (x Chain of Responsibility) implementace komunikace speciální notifikační interface mediátora Observer kolegové vystupují jako subjekty při změně stavu upozorní observera-mediátora rozumná extrakce funkcionality – ne „god“ objekt mediátor neřídí celou funkcionalitu spolupracujících objektů jen zabezpečuje komunikaci mezi nimi Případ notifikačního interface je předávání ukazatele na sebe sama. 11 11
Mediator - implementace Rozhraní/abstraktní třídy public interface IAirTrafficControl { void ReceiveAircraftLocation(Aircraft location); void RegisterAircraftUnderGuidance(Aircraft aircraft); } Rozhraní kolega → mediátor public abstract class Aircraft { private readonly IAirTrafficControl _atc; //z konstruktoru public int Altitude get { return _currentAltitude; } set _currentAltitude = value; _atc.ReceiveAircraftLocation(this); } public void Climb(int heightToClimb) Altitude += heightToClimb; Rozhraní mediátor → kolega 12 12
Mediator - implementace Konkrétní chování v potomcích public class ATCenter : IAirTrafficControl { public void ReceiveAircraftLocation(Aircraft reportingAircraft) { foreach (var currentAircraft in _aircraftsUnderGuidance) { if (//moc blizko) //rozhodnout, ktere letadlo zmeni polohu a o kolik aircraft.Climb(1000); } public void RegisterAircraftUnderGuidance(Aircraft aircraft) { //pridat do kolekce _aircraftUnderGuidance } } public class Airbus321 : Aircraft public class Boeing737200 : Aircraft public class Embraer190 : Aircraft Podle typu letadla různá bezpečná vzdálenost, různá priorita 13 13
Mediator – použití Možná použití – počítačový svět GUI Instant messaging, sms zprávy mediátor – chatovací room, operátor kolegové – jednotliví klienti dům budoucnosti – „smart home“ mnoho různorodých zařízení lednice, klimatizace, topení, různá teplotní či vlhkostní čidla alarm, zamykání dveří, ... potřeba koordinace (ne přímo řízení) alarm -> policie, sms majiteli dojde mléko -> objednat paralelní a distribuované výpočty synchronizace, mezivýsledky obchodování na burze řízení letového provozu Trochu rozvést GUI. 14 14
Mediator – související NV Facade fasáda jen abstrahuje skupinu objektů do jednoho rozhraní vnitřní objekty o ní neví jednoduchá jednosměrná komunikace nepřidává funkcionalitu Observer soupeř - možná alternativa v případě jednodušší komunikace doplněk - kolegové mohou komunikovat s mediátorem pomocí Observera Chain of Responsibility zasílání zpráv neznámým objektům přes zřetězené objekty 15 15
Otázky? Několik slov o překladu slova do češtiny (prostředník, zprostředkovatel), vyzdvihnutí počeštěného slova mediátor. 16 16