440 likes | 801 Views
Mediator. (Behavioral). Mediator. Apibrėžiamas objektas, kuris kontroliuoja, kaip sąveikauja aibė objektų. Laisvas objektų susietumas pasiekiamas kolegoms bendraujant su Mediator, o ne tarpusavyje.
E N D
Mediator (Behavioral)
Mediator • Apibrėžiamas objektas, kuris kontroliuoja, kaip sąveikauja aibė objektų. Laisvas objektų susietumas pasiekiamas kolegoms bendraujant su Mediator, o ne tarpusavyje. • Define an object that encapsulates how a set of objects interact.Mediator promotesloose coupling by keeping objects from referring toeach other explicitly, andit lets you vary their interactionindependently.
Motyvacija • Kuomet objektams leidžiama bendrauti vienas su kitu tiesiogiai, jie tampa pernelyg stipriai susieti. • Kuomet objektas nori nusiųsti pranešimą kitam objektui, mums reikia „oro kontrolės“ ekvivalento, kad jis persiųstų pranešimą gavėjui. • Persiunčiama informacija laikoma naujo kontrolerio viduje. • Šis koordinuojantis objektas vadinamas tarpininku (mediator).
Motyvacija AirController Airplane +mediator Boeing 747 Yerevan Int’l Cessna
Pastabos • Colleagues nesiunčia pranešimų vienas kitam: • Jie siunčia pranešimus tarpininkui. • Tarpininkas siunčia pranešimą gavėjui. • Kiekvienas lėktuvas žino apie konkretų kontrolierių. • Kai tik reikia bendravimo, jie eina per AirController.
Pavyzdys Kiekvieną klasę customize‘inti individualiai naudojant subklases būtų varginanti procedūra, kadangi yra daug klasių.
Pavyzdys • Šių problemų galima išvengti enkapsuliuojant bendrą elgesį atskirame mediator objekte. • Mediator yra atsakingas už grupės objektų bendravimo kontrolę ir koordinavimą. • Mediator tarnauja kaip tarpininkas, kuris neleidžia objektams grupėje kreiptis vienam į kitą. • Objektai žino tiktai tarpininką ir tokiu būdu sumažinamas tarpusavio ryšių skaičius.
Pavyzdys FontDialogDirectorcan be the mediatorbetween the widgets in a dialogbox. A FontDialogDirector object knowsthe widgets in a dialog and coordinatestheir interaction. It acts asa hub of communication for widgets:
Pavyzdys • „Listbox“ pasako savo direktoriui, kad pasikeitė. • Direktorius gauna pasirinkimą iš „listbox“. • Direktorius perduoda pasirinkimą „entryfield“. • Kuomet „entryfield“ turi tekstą, direktorius įgalina mygtukus (pvz. "demibold," "oblique"). • Direktorius tarpininkauja tarp „listbox“ ir „entryfield“. Widget‘ai bendrauja netiesiogiai, o per direkrotių, jiems nereikia žinoti apie vienas kitą • Kadangi elgsena lokalizuota vienoje klasėj, ji gali būti pakeista pakeičiant ar praplečiant šią klasę.
Pavyzdys • DialogDirector – abstrakti klasė, apibrėžianti dialogo elgseną. • ShowDialog – parodo dialogą ekrane. • CreateWidgets – abstrakti operacija, kurianti dialogo widget‘us. • WidgetChanged – kita abstrakti operacija, widget‘ai ją kviečia informuoti direktorių, kad jie pasikeitė. • DialogDirector subklasės override‘ina CreateWidgets, kad sukurtų tinkamus widget‘us ir override‘ina WidgetChange, kad suvaldytų pasikeitimus.
Struktūra • Mediator – apibrėžia interfeisą, bendravimui su Colleague objektais. • ConcreteMediator: • Realizuoja kooperatyvinį elgesį, koordinuodamas Colleague objektus. • Žino ir palaiko savo kolegas (colleagues). • Colleague Classes (ListBox, EntryField): • Kiekviena Colleague klasė žino savo Mediator objektą. • Kiekvienas Colleague bendrauja su savo mediatoriumi, kiekvieną kart, kai kitu atveju bendrautų su kitu Colleague.
Kada naudoti Mediator? • Objektų aibė bendrauja gerai apibrėžtais, tačiau sudėtingais būdais. • Tarpusavio priklausomybės yra nestruktūrizuotos ir sunkiai suprantamos. • Sudėtinga objektą panaudoti pakartotinai, kadangi jis kreipiasi ir bendrauja su daug objektų. • Elgsena, paskirstyta tarp keleto klasių, turėtų būti customizable nenaudojant daug subklasių.
Kaip naudoti Mediator? • Identifikuojamos sąveikaujančių objektų kolekcijos, kurių ryšiai turi būti supaprastinti. • Sukuriama nauja abstrakti klasė, enkapsuliuojanti sąveiką. • Sukuriamas šios klasės objektas ir saveika perdaroma atskirai šioje klasėje.
Pasekmės • It limits subclassing. Mediatorius lokalizuoja elgseną, kuri kitu atveju būtų paskirstyta tarp keleto objektų. • Norint pakeisti šią elgseną, reikia tik Mediatorsubklasių. • Colleague klasės gali būti panaudojamos tokios, kokios yra. • It decouples colleagues.Mediatorius suteikia laisvą Colleaguessurištumą. • Galima keisti ir iš naujo panaudoti Mediator klases nepriklausomai. • It simplifies object protocols.Daug-su-daug ryšius mediatorius pakeičia vienas-su-daug ryšiais tarp mediatoriaus ir jo kolegų. • Vienas-su-daug ryšius lengviau suprasti, palaikyti ir praplėsti.
Pasekmės • It abstracts how objects cooperate.Padarant tarpininkavimą nepriklausomu sprendimu ir enkapsuliuojant jį objektuose, leidžia susitelkti į tai, kaip objektai bendrauja, o ne į jų individualų elgesį. • Tai gali padėti paaiškinti, kaip objektai sąveikauja sistemoje. • It centralizes control.Mediator šablonas iškeičia sąveikos sudėtingumą į tarpininko sudėtingumą. • Kadangi tarpininkas enkapsuliuoja protokolus, jis gali tapti sudėtingesnis, nei bet kuris individualus kolega. • Tai gali padaryti tarpininką monolitu, kurį sunku palaikyti.
Realizavimo aspektai • Omitting the abstract Mediator class.Nėra reikalo apibrėžti abstrakčią Mediator klasę, kai kolegos dirba tik su vienu tarpininku. • Abstraktus surišimas, kurį suteikia Mediator klasė leidžia kolegoms dirbti su skirtingomis Mediator subklasėmis ir atvirkščiai. • Colleague-Mediator communication.Kolegos bendrauja su savo tarpininku, kuomet įvyksta dominantis įvykis. • Galima realizuoti tarpininką kaip Observer, naudojant Observer šabloną. • Kolegų klasės elgiasi kaip Subject‘ai, siųsdamos notifikavimus tarpininkui, kuomet pasikeičia jų būsena. • Tarpininkas reaguoja paskleisdamas pasikeitimus kitiems kolegoms.
Susiję šablonai • Observer – bendravimas paskirstomas naudojant Observer ir Subject objektus. • Mediator enkapsuliuoja bendravimą. • Facade – sukuriamas interfeisas visai posistemei. • Posistemė nežino apie Facade. • Facade neprideda funkcionalumo, Mediator prideda. • Mediatoriaus kolegos žino apie Mediator.
Facade (Structural)
Facade • Suteikia bendrą interfeisą posistemės interfeisų aibei. • Facade apibrėžia aukštesnio lygio interfeisą, kurio pagalba tampa lengviau naudotis posisteme.
Motyvacija • Sistemos struktūrizavimas į posistemes padeda sumažinti sudėtingumą. • Posistemės – klasių grupės arba klasių grupės ir kitos posistemės. • Kad sumažinti sudėtingumą galima suskurti Facade objektą, kuris suteikia vieną, paprastą interfeisą, posistemės teikiamoms paslaugoms.
Pavyzdys • Compiler klasė apibrėžia bendrą interfeisą kompiliatoriaus funkcionalumui. • Ji suteikia klientams vieną, paprastą interfeisą, sujungia klases, realizuojančias kompiliatorių, pilnai jų nepaslėpdama.
Struktūra • Facade: • Žino, kurios posistemės klasės atsakingos už užklausos apdorojimą. • Perduoda kliento užklausas atitinkamiems posistemės objektams. • Subsystem Classes: • Realizuoja posistemės funkcionalumą; • Apdoroja užduotis, paskirtas Facade objekto. • Nežino apie facade, tai yra, nelaiko į jį nuorodų.
Bendradarbiavimas • Klientai bendrauja su posisteme, siųsdami užklausas Facade, kuris persiunčia jas atitinkamiems posistemės objektams. • Klientams, naudojantiems fasadą, nereikia prieiti prie posistemės objektų tiesiogiai.
Kada naudoti Facade? • Kuomet reikia paprasto sudėtingos posistemės interfeiso. • Daugumai klientų šis interfeisas pakankamai geras. • Sudėtingesni klientai gali „žiūrėti“ už fasado. • Atskirti posistemės klases nuo kliento ir kitų posistemių, tokiu būdu skatinant posistemių nepriklausomumą ir pernešamumą.
Pasekmės • Paslepia posistemės realizaciją nuo klientų, tokiu būdu tampa lengviau naudoti posistemes. • Suteikia mažą kliento ir posistemės susietumą. • Tai leidžia keisti posistemę sudarančias klases nepaveikiant kliento. • Didelėse sistemose sumažina kompiliavimo priklausomybes. • Palengvina posistemių pernešimą iš vienos platformos į kitą. • Nedraudžia sudėtingesniems klientams prieiti prie posistemės klasių. • Facade neprideda jokio funkcionalumo, tiesiog supaprastina interfeisus.
Realizacijos pavyzdys Class1's doSomethingComplicated() method takes an integer and returns its cube. Class2's doAnotherThing() method doubles the cube of an integer and returns it. Class3's doMoreStuff() takes a Class1 object, a Class2 object, and an integer and returns twice the sixth power of the integer.
Susiję šablonai • Abstract Factory gali būti naudojamas kartu su Facade, kad suteiktų interfeisą, skirtą posistemės objektų kūrimui, nepriklausomu nuo posistemės būdu. • Abstract Factory taip pat gali būti naudojamas kaip alternatyva Facade, kad paslėptų specifines platformai klases. • Mediator panašus į Facade tuo, kad abstrahuoja egzistuojančių klasių funkcionalumą. • Dažnai reikia tik vieno Facade objekto, todėl Facade objektai dažnai yra Singleton‘ai.