Chain of responsibility

Podobné dokumenty
Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Návrhové vzory OMO, LS 2014/2015

PREPROCESOR POKRAČOVÁNÍ

Abstract Factory úvod

Algoritmizace a programování

State. Známý jako. Účel. Použitelnost. Stav, Object for States. umožňuje objektu měnit svoje chování v závislosti na stavu objekt mění svou třídu

typová konverze typová inference

specifikuje vytvářené objekty pomocí prototypické instance nový objekt vytváří kopírováním prototypu

Principy objektově orientovaného programování

Úvod do programovacích jazyků (Java)

Jazyk C# (seminář 6)

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Semin aˇr Java N avrhov e vzory Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Duben 2008 Radek Koˇc ı Semin aˇr Java N avrhov e vzory 1/ 24

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Programování v C++ 3, 3. cvičení

Semin aˇr Java N avrhov e vzory Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Duben 2009 Radek Koˇc ı Semin aˇr Java N avrhov e vzory 1/ 25

Návrhové vzory. Jakub Klemsa, Jan Legerský. 30. října Objektově orientované programování.

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

Dědění, polymorfismus

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Programování v C++ 1, 5. cvičení

Třídy, polymorfismus. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

Kód, který se nebude často měnit

Problém, jehož různé instance je třeba často řešit Tyto instance lze vyjádřit větami v jednoduchém jazyce

Mediator motivace. FontDialog. závislosti mezi jednotlivými ovládacími prvky jsou netriviální

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Programování v C++ 2, 7. cvičení

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

Abstraktní třída a rozhraní

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

Generické programování

20. Projekt Domácí mediotéka

RMI Remote Method Invocation

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Programování v C++ 1, 6. cvičení

Class loader. každá třída (java.lang.class) obsahuje referenci na svůj class loader. Implementace class loaderu

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Dědičnost. seskupování tříd do hierarchie. potomek získá všechny vlastnosti a metody. provádí se pomocí dvojtečky za názvem třídy.

Události. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

Jazyk C# (seminář 3)

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Teoretické minimum z PJV

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

KTE / ZPE Informační technologie

Objektově orientované programování v PHP 5. Martin Klíma

Objektově orientované programování

1. Programování proti rozhraní

Základní pojmy. Matice(řádky, sloupce) Matice(4,6) sloupce

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Příklad aplikace Klient/Server s Boss/Worker modelem (informativní)

Java a XML. 10/26/09 1/7 Java a XML

Úvod do programování - Java. Cvičení č.4

Výčtový typ strana 67

1. Dědičnost a polymorfismus

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

GUI. Systémová integrace pro desktopové aplikace

Programování v C++ 2, 4. cvičení

Základy objektové orientace I. Únor 2010

Objekt. základní prvek v OOP. má vlastnosti. má metody. vznikne vytvoření nové instance definován pomocí třídy

Abstraktní datové typy: zásobník

Abstraktní třídy, polymorfní struktury

, Brno Připravil: David Procházka Návrhové vzory

5 Rekurze a zásobník. Rekurzivní volání metody

Zápis programu v jazyce C#

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Programování v C++ 2, 8. cvičení

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

PB161 Programování v jazyce C++ Přednáška 7

Dědičnost (inheritance)

Abstraktní datové typy

Programátorská příručka

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

SOUBORY, VSTUPY A VÝSTUPY POKRAČOVÁNÍ

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

PB161 Programování v jazyce C++ Přednáška 7

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Struktura třídy, operátory, jednoduché algoritmy, junit. Programování II 2. cvičení Alena Buchalcevová

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

IRAE 07/08 Přednáška č. 7. Začátek (head)

Datové struktury. alg12 1

Programování v Javě I. Únor 2009

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.

Vytváření a použití knihoven tříd

Výjimky. v C# a Javě

UJO Framework. revoluční architektura beans. verze

PŘETĚŽOVÁNÍ OPERÁTORŮ

3. Třídy. Základní pojmy objektového programování. Třídy

Tvorba informačních systémů

Programovací jazyk Java

Pokud neuvedeme override, vznikne v synu nová (nevirtuální) metoda (a pochopitelně se nezavolá, jak bychom

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

Osnova přednášky. Programové prostředky řízení Úvod do C# II. Přístup ke členům. Členy (Members)

Programování v Javě I. Leden 2008

PB161 Programování v jazyce C++ Přednáška 9

Třídy a objekty. Třídy a objekty. Vytvoření instance třídy. Přístup k atributům a metodám objektu. $z = new Zlomek(3, 5);

Motivační příklad reálný svět. výroba (assembly line)

Při studiu tohoto bloku se předpokládá, že student je zvládá základy programování v jazyce Java s využitím vývojového prostředí NetBeans.

1. Téma 12 - Textové soubory a výjimky

Transkript:

Chain of responsibility

Chain of responsibility n Známý jako n Účel q český překlad řetěz(ec) odpovědnosti q umožnit zasílání požadavků (zpráv) neznámým příjemcům q příjemci tvoří frontu è předávají si zprávu dokud ji někdo nezpracuje q nechceme dopředu určit, který objekt obsluhuje správu q umožňuje zrušení vazby mdzi odesilatelem a příjemcem zprávy n Motivace q přidat k widgetu nápovědu q chceme reakci v závislosti na kontextu ve kterém se widget nachází

Chain of responsibility motivace ukazatel na následníka v řetězu jednotný předek všech widgetů výchozí implementace aplikační třída - zarážka pro help konkrétní widgety widgety mohou implementovat vlastní HandleHelp

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

n Použitelnost Chain of responsibility použitelnost, výhody, nevýhody q chceme zaslat zprávu a nevíme kdo ji zpracuje nebo nás to nezajímá n důležitý je výsledek q pokud více než jeden příjemce může přijmout zprávu a není a priori známo který n Výhody q odděluje odesílatele od příjemců q zjednodušuje odesílatele neobsahuje reference na všechny možné příjemce q možnost měnit řetěz dynamicky, za běhu programu n Nevýhody q není zaručeno, že nějaký příjemce zprávu přijme n při implementaci ale typicky vytvoříme zarážku q zpracuje požadavek na nejobecnější úrovni q nebo zahlásí chybu (kulturně)

Chain of responsibility implementace n Implementace q dva způsoby implementace řetězu n definovat nové ukazatele (obvykle v Handleru, možno i v ConcreteHandleru) n použít existující ukazatele (Composite ) class HelpHandler { public: HelpHandler(HelpHandler* s) : _successor(s) { virtual void HandleHelp(); private: HelpHandler* _successor; ; void HelpHandler::HandleHelp () { if (_successor) { _successor->handlehelp(); výchozí implementace zpracování požadavku předej peška dál

Chain of responsibility - příklad typedef int Topic; const Topic NO_HELP_TOPIC = -1; class HelpHandler { public: HelpHandler(HelpHandler* = 0, Topic = NO_HELP_TOPIC); virtual bool HasHelp(); virtual void SetHandler(HelpHandler*, Topic); virtual void HandleHelp(); private: HelpHandler* _successor; Topic _topic; ; HelpHandler::HelpHandler ( HelpHandler* h, Topic t ) : _successor(h), _topic(t) { bool HelpHandler::HasHelp () { return _topic!= NO_HELP_TOPIC; pomocná metoda, test na existenci nápovědy na konkrétním widgetu Komentář: Implementace abstraktního předka všech tříd využívajících kontextovou nápovědu. HelpHandler definuje ukazatele na následníka v řetězu. Pro každé téma nápovědy definujeme jednoznačný identifikátor. Jestliže pro daný widget neexistuje nápověda, použije se výchozí hodnota NO_HELP_TOPIC. Použití konkrétních hodnot uvidíme dále. void HelpHandler::HandleHelp () { if (_successor!= 0) { _successor->handlehelp();

n Chain of responsibility - příklad Abstraktní předek Widgetů class Widget : public HelpHandler { protected: Widget(Widget* parent, Topic t = NO_HELP_TOPIC); private: Widget* _parent; ; Widget::Widget (Widget* w, Topic t) : HelpHandler(w, t){ _parent = w; Abstraktní předek všech widgetů. Přidává navíc ukazatel na rodiče, tj. prvek, ve kterém je umístěn. Tlačítko je vždy součástí jiného widgetu. n Button class Button : public Widget { public: Button(Widget* d, Topic t = NO_HELP_TOPIC); virtual void HandleHelp(); // Widget operations that Button overrides... ; Button::Button (Widget* h, Topic t) : Widget(h, t) { void Button::HandleHelp () { if (HasHelp()) { // offer help on the button else { HelpHandler::HandleHelp();

Chain of responsibility - příklad n Dialog class Dialog : public Widget { public: Dialog(HelpHandler* h, Topic t = NO_HELP_TOPIC); virtual void HandleHelp(); // Widget operations that Dialog overrides... //... ; Komentář: Třída Dialog je sama widget, ale navenek existuje samostatně není součástí jiného widgetu. Proto v konstruktoru předáváme HelpHandler. Dialog::Dialog (HelpHandler* h, Topic t) : Widget(0) { SetHandler(h, t); void Dialog::HandleHelp () { if (HasHelp()) { // offer help on the dialog else { HelpHandler::HandleHelp();

Chain of responsibility - příklad n Aplikace class Application : public HelpHandler { public: Application(Topic t) : HelpHandler(0, t) { virtual void HandleHelp(); // application-specific operations... ; void Application::HandleHelp () { // show a list of help topics n n Třída Application není widget dědí přímo od HelpHandler Je-li požadavek na nápovědu propagován až na tuto úroveň, může aplikace zobrazit obecnou nápovědu nebo např. seznam témat nápovědy.

Chain of responsibility - příklad n Vytvoření a propojení prvků const Topic PRINT_TOPIC = 1; const Topic PAPER_ORIENTATION_TOPIC = 2; const Topic APPLICATION_TOPIC = 3; Application* application = new Application(APPLICATION_TOPIC); Dialog* dialog = new Dialog(application, PRINT_TOPIC); Button* button = new Button(dialog, PAPER_ORIENTATION_TOPIC); n Vyvolání nápovědy ze strany klienta button->handlehelp();

Chain of responsibility příklad II n Logování q Chceme, aby událost mohli zachytit různe typy logů Abstraktní předek všech logů abstract class Logger { public static int ERR = 3; public static int NOTICE = 5; public static int DEBUG = 7; protected int mask; Následující objekt v chain protected Logger next; // the next element in the chain of responsibility public Logger setnext(logger l) { next = l; return this; abstract public void message(string msg, int priority); Obsluha události chybí default obsluha

Chain of responsibility příklad II class DebugLogger extends Logger{ public DebugLogger(int mask) { this.mask = mask; public void message(string msg, int priority) { if (priority <= mask) println("writing to debug output: "+msg); if (next!= null) next.message(msg, priority); Konkrétní potomkové abstraktní třídy Logger class EMailLogger extends Logger{ public EMailLogger(int mask) { this.mask = mask; public void message(string msg, int priority) { if (priority <= mask) println("sending via e-mail: "+msg); if (next!= null) next.message(msg, priority); class StderrLogger extends Logger{ public StderrLogger(int mask) { this.mask = mask; public void message(string msg, int priority) { if (priority <= mask) println("writing to stderr: "+msg); if (next!= null) next.message(msg, priority);

Chain of responsibility příklad II n Použití vytvoření chain class ChainOfResponsibilityExample{ public static void main(string[] args) { // building the chain of responsibility Logger l = new DebugLogger(Logger.DEBUG).setNext( new EMailLogger(Logger.ERR).setNext( new StderrLogger(Logger.NOTICE) )); l.message("entering function y.", Logger.DEBUG); // handled by DebugLogger l.message("step1 completed.", Logger.NOTICE); // handled by Debug- and StderrLogger l.message("an error has occurred.", Logger.ERR); // handled by all three Logger

Chain of responsibility reprezentace správ Jako reprezentovat požadavek klienta? n zadrátované natvrdo q omezená pevná množina requestů q bezpečné n Integer alebo stringová konstanta q Flexibilnejší q Odesílatel i příjemce se musí shodnout na kodóvaní n Object Request q Všechny requesty se zabalí do objektu se společným předkem q Accessor function nebo RTTI q Podtřídy zachytí jen požadavky, které je zajímají, ostatní pošlou dál q NV Command void ExtendedHandler::HandleRequest (Request* therequest) { switch (therequest->getkind()) { case Preview: dosomething(); break; default: Handler::HandleRequest(theRequest);

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

n Související NV q Command Chain of Resposibility souvisejíci NV n přesně specifikuje příjemce požadavku q Composite n je-li řetez objektů využívaný součástí rozsáhlejší struktury, je tato struktura obvykle tvořena pomocí Composite vzoru q Template method n využíván k řízení chování jednotlivých objektů ve struktuře q Decorator n Request handler může použít decorator na změnu requestu při předávaní