Chain of Responsibility. Chain of responsibility - účel Účel  Umožňuje zrušení vazby mezi odesílatelem a příjemcem požadavku  Umožňuje zaslání požadavku.

Slides:



Advertisements
Podobné prezentace
(instance konkrétní třídy)
Advertisements

Seminář C++ 5. cvičení Dědičnost Ing. Jan Mikulka.
Mediator. Mediator - motivace  FontDialog  závislosti mezi jednotlivými ovládacími prvky jsou netriviální.
Funkce Připomeňme si program pro výpočet faktoriálu:
Programovací jazyk C++
Přednáška 11 Jiří Šebesta
Proxy. Definice  zástupce nebo náhradník za dotyčný objekt  proxy i zastoupený objekt dědí od stejného interfacu  proxy kontroluje přístup k objektu.
Spojové struktury Spojová struktura ( linked structure ):
Třetí cvičení Podmíněné příkazy Cykly Break a Continue Switch Return
Pole, ukazatele a odkazy
BLIŽŠÍ POHLED NA TŘÍDY, DĚDIČNOST - úvod
PJV151 Vnořené a vnitřní členy mohou být členy tříd a interfejsů. Je-li X obalem Y a Y je obalem Z, pak Z získá jméno X$Y$Z - kompilací vzniknou classy.
Počítače a programování 1. Obsah přednášky Výjimky - základní typy výjimek Způsoby zpracování výjimek.
Polymorfismus Dědičnost
Objekty v CLIPSu RNDr. Jiří Dvořák, CSc.
Chain of responsibility Martin Malý prezentace na předmět Návrhové vzory (PRG024) na MFF UK
State. State – kontext a problém Kontext  chování objektu má záviset na jeho stavu, který se typicky mění za běhu Neflexibilní řešení  metody obsahují.
Páté cvičení Dědičnost Interface Abstarktní třídy a metody
Adapter. Adapter – pojem Součástka navržená k propojení dvou „nekompatibilních“ zařízení Definice slova podle Cambridge Advanced Learner's Dictionary:
Objektové programování
Operační systémy.
Jedenácté cvičení Vlákna. Java cv112 Vlákna Operační systém Mutitasking – více úloh se v operačním programu vykonává „současně“ Java Multithreading -
Seminář C cvičení Obsluha výjimek Ing. Jan Mikulka.
08/04/20151 Delegáty (1) Delegát (delegate) je datový typ, který definuje signaturu metody Delegáty bývají rovněž označovány jako typo- vě bezpečné ukazatele.
Strategy. Strategy – „All-in-1“ na začátek class AStrategy { public: virtual void Algorithm()=0; protected: AStrategy(); }; class SpecificStrategy: public.
Facade [f ə ˈ s ɑː d]f ə ˈ s ɑː d. Facade Před: Po:
Composite [kompozit, ne kompozajt]. Composite Výslovnost  kompozit, ne kompozajt Účel  Popisuje, jak postavit hierarchii tříd složenou ze dvou druhů.
6. cvičení Polymorfismus
Memento. Obnovení operačního systému ( Windows | Linux...) Všichni víme, co jsou transekce v databázi Memento – zálohování databáze.
KIV/PPA1 cvičení 8 Cvičící: Pavel Bžoch. Osnova cvičení Objekty v Javě Třída Konstruktor Metody Metody a proměnné třídy x instance Program sestávající.
OSNOVA: a) Úvod do OOPb) Třídy bez metod c) Třídy s metodamid) Konstruktory a destruktory e) Metody constf) Knihovní třídy g) Třídy ve tříděh) Přetížení.
Algoritmizace a programování Objektově orientované programování - 16 Mgr. Josef Nožička IKT Algoritmizace a programování
Návrhový vzor Factory v JAVA API Martin Kot Katedra informatiky VŠB – Technická univerzita Ostrava
IB111 Programování a algoritmizace
Návrh a tvorba WWW Přednáška 5 Úvod do jazyka PHP.
OSNOVA: a) Přetížení členských funkcí b) Dědičnost tříd Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače a programování 2 pro obor EST BPC2E.
Dědičnost - inheritance dědičnost je jednou z forem znovupoužitelnosti dědičnost je jednou z forem znovupoužitelnosti B A Třída A je předkem třídy B Třída.
Šesté cvičení Výjimky Balíky.
Decorator. Rozšiřuje objekty o dodatečné chování  rozšiřuje konkrétní objekty, ne třídy  rozšiřuje objekt dynamicky, tj. za běhu Upřednostňuje kompozici.
FEL Komunikátor. Memory Leak program konsumuje operační paměť, kterou neumožňuje uvolnit o uvolnění paměti stará Garbage Collector ▫plně v režii Java.
Vazby dynamických proměnných,databázové systémy Přednáška č. 10.
Jazyk C A0B36PRI - PROGRAMOVÁNÍ Část II.
Jazyk C A0B36PRI - PROGRAMOVÁNÍ Část I.
NEÚPLNÁ PODMÍNKA V JAVĚ úkol 1_26. ZADÁNÍ Napište zdrojový kód k zadanému vývojovému diagramu.
Observer Martin Dráb Návrhové vzory, Co to je?  Definuje závislost 1:N mezi objekty  Závislé objekty jsou informovány o změně stavu  Konzistentní.
ZADÁNÍ Sestavte program, který vytiskne n hvězdiček.
Strategy. Motivace Různé algoritmy pro stejnou akci Hromada kódu v mnoha podmínkách Důsledky  Komplexnost  Špatná čitelnost  Těžká správa kódu  Těžka.
Proxy. Popis  Klient má přístup k nějakému objektu  Potřebujeme tento přístup ošetřit, aniž bychom přidělali klientovi práci Kontrola přístupu Vzdálený.
Template Method. Motivační příklad – reálný svět Čaj 1) Uvař vodu 2) Dej do hrnku sáček čaje 3) Zalij hrnek 4) Přisyp cukr a vymačkej citrón Káva 1) Uvař.
Composite “ Spojuj a panuj ”. Zakladní vlastnosti Výslovnost  kompozit, ne kompozajt Účel  Popisuje, jak postavit strukturované hierarchie tříd, v níž.
Iterator. C historie int * rand_numbers(int n) { int *numbers = malloc(n * sizeof(int)); int *it = numbers; while (it < numbers + n) *it++ = rand(); //
Praha & EU: Investujeme do vaší budoucnosti Evropský sociální fond Gymnázium, Praha 10, Voděradská 2 Projekt OBZORY Datové typy a operátory Základní programové.
Proxy. Proxy poskytuje bariéru mezi klientem a reálnou implementací.
Y36PJC Programování v jazyce C/C++
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.
Programování ENUM, SWITCH,pole jednorozměrná a vícerozměrná, deklarace, inicializace, kopírování, porovnání Erik Král.
Programovací jazyk C++
Y36PJC Programování v jazyce C/C++
Programování 2. hodina RNDr. Jan Lánský, Ph.D.
Návrhový vzor Flyweight
Abstract Factory.
TNPW1 JavaScript Ing. Jiří Štěpánek.
Strategy „Definujte rodinu algoritmů, zapouzdřuje je aby byly vzájemně zaměnitelné. Strategie umožňuje, aby se algoritmus nebyl závislý na klientech, kteří.
Chain of Responsibility
Bridge.
C# přehled vlastností.
Přednášky z Distribuovaných systémů
Proxy 1.
Composite “Spojuj a panuj”.
Bridge.
Transkript prezentace:

Chain of Responsibility

Chain of responsibility - účel Účel  Umožňuje zrušení vazby mezi odesílatelem a příjemcem požadavku  Umožňuje zaslání požadavku (zprávy) neznámým příjemcům  Nemusí být předem zřejmé, který objekt požadavek obslouží  Snadná rozšiřitelnost, či změna za běhu  Příjemci tvoří spojový seznam předávají si požadavky (dokud je někdo nezpracuje)

Chain of responsibility – struktura Struktura Účastníci Handler  definuje rozhraní pro zpracování požadavků  volitelně implementuje ukazatel na následníka ConcreteHandler  zachytává požadavek, který umí zpracovat  může přistupovat na svého následníka Client  vyvolává požadavek předáním na objekt ConcreteHandler zapojený do řetězu

Chain of responsibility - příklady Subsystém pro počítání hodnoty mincí  Nápojový automat přijímá mince o nominálních hodnotách 1, 2, 5, 10, 20 a 50Kč.  Má pouze jeden vstup na mince… a několik zásobníků na mince (podle nominální hodnoty). Kontextová nápověda widgetu (viz GoF)  Obsah nápovědy dle závislosti na kontextu, ve kterém se widget nachází. Vzdálené zpracování požadavků  Skupina serverů poskytuje nějakou (stejnou) službu.  Klientům záleží pouze na poskytnutí služby, ne na tom, kým je nakonec poskytnuta.

Chain of responsibility – implementace Subsystém pro počítání hodnoty mincí  Nominální hodnota mince je určena rozměry a hmotností  Bázový handler class Coin { public float Weight { get; set; } public float Diameter { get; set; } } abstract class CoinHandlerBase { protected CoinHandlerBase _successor; public abstract void HandleCoin(Coin coin); public void SetSuccessor(CoinHandlerBase successor) { _successor = successor; } Lze samozřejmě předávat například v konstruktoru

Chain of responsibility – implementace  Handlery pro konkrétní mince class OneCrownHandler : CoinHandlerBase { public override void HandleCoin(Coin coin) { if (Math.Abs(coin.Weight – 3,25) < 0,02) && Math.Abs(coin.Diameter – 18) < 0,1) { // Zpracování mince } else { _successor.HandleCoin(coin); } Je tento handler určen ke zpracování dodané mince? class TwoCrownsHandler : CoinHandlerBase { … } class FiveCrownsHandler : CoinHandlerBase { … } class TenCrownsHandler : CoinHandlerBase { … } class TwentyCrownsHandler : CoinHandlerBase { … } class FiftyCrownsHandler : CoinHandlerBase { … } Rozdíl pouze v klauzuli if funkce HandleCoin(), jinak totožné s příkladem OneCrown

Chain of responsibility – implementace Použití CoinHandlerBase c1 = new OneCrownHandler(); CoinHandlerBase c2 = new TwoCrownsHandler(); CoinHandlerBase c5 = new FiveCrownsHandler(); CoinHandlerBase c10 = new TenCrownsHandler(); CoinHandlerBase c20 = new TwentyCrownsHandler(); CoinHandlerBase c50 = new FiftyCrownsHandler(); c1.SetSuccessor(c2); c2.SetSuccessor(c5); c5.SetSuccessor(c10); c10.SetSuccessor(c20); c20.SetSuccessor(c50); Coin one = new Coin( Diameter = 24,47F, Weight = 6,5F ); Coin ten = new Coin( Diameter = 27,24F, Weight = 8,1F ); Coin unknown = new Coin( Diameter = 42,89F, Weight = 1,0F ); CoinHandlerBase handler = c1; handler.HandleCoin(one); handler.HandleCoin(ten); handler.HandleCoin(unknown); Vytvoření handlerů pro validní mince ?!? Mince k použití Vstupní bod do subsystému Nastavení pořadí zpracování

Chain of responsibility – unknown Řešení class UnknownHandler : CoinHandlerBase { public override void HandleCoin(Coin coin) { // Zpracování neznáme mince } Vytvoření handleru pro neznámé mince... CoinHandlerBase c50 = new FiftyCrownsHandler(); CoinHandlerBase unknownHandler = new UnknownHandler();... c50.SetSuccessor(unknownHandler);... Coin unknown = new Coin( Diameter = 42,89F, Weight = 1,0F );... handler.HandleCoin(unknown); Neznámé mince zpracuje UnknownHandler

Chain of responsibility – vzdálené zpracování Vzdálené zpracování požadavků  Skupina serverů poskytuje nějakou (stejnou) službu.  Klientům záleží pouze na poskytnutí služby, ne na tom, kým je nakonec poskytnuta. Vzdálené zpracování požadavků – bez použití NV  Definice serveru a jeho služeb – původní řešení class Server { private static int mNextID = 1; private int mID = mNextID++; private bool IsBusy() {…} public bool handle(int num) { if (IsBusy()) { return false; } System.out.println( mID + " handled " + num ); return true; }

Chain of responsibility – vzdálené zpracování Vzdálené zpracování požadavků – s použitím NV  Definice serveru a jeho služeb – nové řešení class Server { private static int mNextID = 1; private int mID = mNextID++; private Server mNextServer; private bool IsBusy() {…} public void add(Server next) { if (mNextServer == null) mNextServer = next; else mNextServer.add(next); } public void wrapAround(Server root) { if (mNextServer == null) mNextServer = root; else mNextServer.wrapAround(root); } public void handle(int num) { if (IsBusy()) mNextServer.handle(num); else System.out.println( mID + " handled " + num ); } Server nemůže zpracovat požadavek, předává ho dále Funkce slouží k uzavření serverů „do kruhu“, každý požadavek musí být zpracován Propojí poslední server s prvním

Chain of responsibility – rozdíl v použití Bez použití NV public class ChainDemo { public static void main(String[] args) { Server[] nodes = {new Server(), new Server(), new Server()}; int request = 1; j = 0; while (!nodes[j].handle(request)) j = (j + 1) % nodes.length; } S použitím NV public class ChainDemo { public static void main(String[] args) { Server serverRoot = new Server(); serverRoot.add( new Server() ); serverRoot.wrapAround( serverRoot ); int request = 1; serverRoot.handle(request); }

Chain of responsibility - následník Class Handler { public: HelpHandler(HelpHandler* s) : _successor(s) { } virtual void Handle (); private: Handler* _successor; }; void Handler::Handle() { if (_successor) { _successor->HandleHelp(); } class ConcreteHandler : public Handler { public: ConcreteHandler(Handler* h); virtual void Handle(); bool HasHandle(); }; ConcreteHandler:: ConcreteHandler(Handler* h) : Handler(h) { } void ConcreteHandler::HandleHelp () { if (HasHandle()) { // handle } else { HelpHandler::HandleHelp(); } Co když zapomenu zavolat nejakou funkci, která předává požadavek dál?

Chain of responsibility - následník public abstract class ClassicChain { private ClassicChain next; public ClassicChain(ClassicChain nextNode) { next = nextNode; } public final void start(ARequest request) { boolean handledByThisNode = this.handle(request); if (next != null && !handledByThisNode) next.start(request); } protected abstract boolean handle(ARequest request); } public class AClassicChain extends ClassicChain { protected boolean handle(ARequest request) { boolean handledByThisNode = false; if(someCondition) { //Do handling handledByThisNode = true; } return handledByThisNode; } Volání nasledníka vynutíme pomocí programovacího jazyka, nikoliv pomocí paměti programátora

Chain of responsibility – s podtřídami Zpracování požadavků s podtřídami:  Podtřída zpracuje pouze požadavky, o níž má zájem, další požadavky jsou předávány do rodičovské tříd y Třeba definovat typ požadavku class ExtendedHandler : public Handler { public: virtual void HandleRequest(Request* theRequest); //... }; void ExtendedHandler::HandleRequest (Request* theRequest) { switch (theRequest->GetKind()) { case Preview: // handle the Preview request break; default: // let Handler handle other requests Handler::HandleRequest(theRequest); }

Chain of responsibility – použitelnost Použitelnost  Chceme zaslat zprávu a nevíme kdo ji zpracuje nebo nás to nezajímá Důležitý je výsledek!  Pokud více než jeden příjemce může přijmout zprávu a není apriori známo který Výhody  Odděluje odesílatele od příjemců  Zjednodušuje odesílatele – neobsahuje reference na všechny možné příjemce – viz „vzdálené zpracování požadavků“  Možnost měnit řetěz dynamicky, za běhu programu Nevýhody  není zaručeno, že nějaký příjemce zprávu přijme – viz „subsystém pro počítání hodnoty mincí bez UnknownHandler“ při implementaci na to tedy musíme myslet

Chain of responsibility – známé použití Známé použití  Grafické toolkity (Java AWT – nevhodné použití, neujalo se)  Okenní systémy běžně používáno pro zpracování událostí jako kliknutí myši, stisk klávesy  Windows hooks Požadavek projde všechny handlery  Java Servlet Filter Http request může zpracovat více filtrů  Distribuované systémy v řetězu (do kruhu) je zapojena množina serverů nabízejících určité služby klient předá požadavek libovolnému serveru servery si mezi sebou posílají požadavek, dokud jej některý nezpracuje

Chain of Resposibility – souvisejíci NV Související NV  Composite Je-li řetěz objektů využívaný součástí rozsáhlejší struktury, je tato struktura obvykle tvořena pomocí Composite vzoru

Chain of Resposibility – zdroje GoF Různé detaily implementace  Nepoužité příklady   Responsibility.htm   Použití ve Windows hooks 