160 likes | 330 Views
Chain of Responsibility. Autor: Milan Šafárik. Úvod. Tento vzor patrí do skupiny Behavioral Patterns . Vzor sa vyhýba spojeniu odosielateľa požiadavky s príjemcom tak, že umožní spracovať žiadosť viac ako jednému objektu.
E N D
ChainofResponsibility Autor: Milan Šafárik
Úvod • Tento vzor patrí do skupiny BehavioralPatterns. • Vzor sa vyhýba spojeniu odosielateľa požiadavky s príjemcom tak, že umožní spracovať žiadosť viac ako jednému objektu. • Zreťazuje prijímacie objekty a odovzdáva požiadavku pozdĺž reťazca, kým ju nejaký objekt nespracuje.
Motivácia • Príkladom využitia môže byť systém nápovedy pre grafické užívateľské rozhranie. Ak užívateľ potrebuje poradiť, klikne na danú časť rozhrania a dostane k nej nápovedu. Táto pomocná informácia závisí na časti rozhrania a jej kontexte. • Ak nie je špecifikovaná informácia pre nejakú časť rozhrania, potom by mal systém zobraziť všeobecnejšiu informáciu o kontexte.
Motivácia Preto je prirodzené, organizovaťpomocné informácie podľa ich všeobecnosti - Od najviac konkrétnych ku najviac všeobecným. Pomocná požiadavka môže byť spracovaná jedným z niekoľkých userinterface objektov. Problémom je, že objekt, ktorý poskytuje pomoc nie je explicitne známy k objektu, ktorý inicializuje požiadavku. Tento vzor ukazuje spôsob, ako oddeliť objekt inicializujúci požiadavku od objektov, ktoré ju môžu spracovať.
Motivácia Prvý objekt v reťazci prijme žiadosť a buď ju spracuje, alebo ju posunie ďalšiemu objektu v reťazci, ktorý robí to isté. Objekt, ktorý poslal požiadavku nemá žiadne znalosti o tom, kto požiadavku spracuje. Hovoríme, že požiadavka má implicitného prijímateľa.
Preposielaniepožiadavky Na preposielaniepožiadavkypo reťazci a zachovanie implicitných prijímateľov, každý objekt v reťazci zdieľa spoločné rozhranie pre spracovanie požiadavky a pre prístup k jeho nasledovníkovi v reťazci.
Účastníci Handler • Definuje rozhranie pre spracovávanie žiadostí. • (voliteľné) implementuje prepojenie na nasledovníka. ConcreteHandler • Spracováva požiadavky, za ktoré je zodpovedný. • Môže pristupovať ku svojmu nasledovníkovi. • Ak môže spracovať požiadavku, spraví to. Inak ju prepošle nasledovníkovi. Client • Pošle požiadavku ku ConcreteHandlerv reťazci.
Uplatnenie Použitie vzoru je vhodné ak: • Požiadavku môže spracovať viac ako jeden objekt a spracovávateľ nie je vopred známy. Spracovateľ sa má určiť automaticky. • Ak chceme vytvoriť žiadosť pre jedného z viacerých objektov bez uvedenia príjemcu. • Množina objektov, ktoré môžu spracovať požiadavku by mala byť určená dynamicky.
Následky • Zjednodušuje prepojenie medzi objektmi - Ani prijímateľ ani odosielateľ nemajú žiadne vedomosti o sebe navzájom a objekt v reťazci nemusí nič vedieť o štruktúre reťazca. • Flexibilita - Zodpovednosť za spracovanie požiadavky môžeme upraviť pridaním alebo inou zmenou reťazca počas behu. • Spracovanie požiadavky nie je zaručené - Pretože žiadosť nemá uvedeného príjemcu, nie je istota, že bude spracovaná.
Známe využitie Najzákladnejším príkladom využitia tohto vzoru je princíp dedičnosti. Ak je volaná funkcia triedy, ktorá tuto funkciu neobsahuje, dochádza k hľadaniu funkcie v triedach, z ktorých je dedená. Ďalejsa ChainofResponsibility zvykne využívať na spracovávanie userEvents(kliknutie myšou alebo stlačenie klávesy).