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 - 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. 8 8
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 9 9
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 10 10
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 SOLID – Single Responsibility Principle 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 11 11
Mediator - důsledky Výhody a omezení Odstraňuje nutnost referencí na všechny spolupracující objekty Kolegové o sobě navzájem nevědí -> reusability 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 může být složitý 12 12
Mediator - důsledky Co když komunikujeme s databází a reálnými letadly? 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 } } 13 13
Mediator - rozšířená verze Použití v kombinaci s CQRS CQRS Command & Query Responsibility Segregation DDD – chceme vyjadřovat doménovou logiku Pokusíme se o tenkého Mediatora SRP – pouze komunikace objektů, doménová logika je v Handlerech DRY – znovupoužití Command / Query 14 14
Mediator - rozšířená verze 15 15
Mediator - rozšířená verze Na font dialog je CQRS trochu overkill Ukážeme si reálný use case REST API v ASP.NET Core Autentikace uživatele 16 16
Mediator - rozšířená verze ne cerne pozadi - pres dataprojektor to neni videt 17 17
Mediator - rozšířená verze prilis maly font, necitelne, vyberte jen podstatne fragmenty ne cerne pozadi 18 18
Mediator - rozšířená verze 19 19
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 20 20
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 Web services Trochu rozvést GUI. 21 21
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 (publish – subscribe) 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 CQRS 22 22