Observer. Klasifikace. Alias. Smysl. Potřeba sledování změn objektu a notifikace. Obdoba systému událostí (C#, Java) vlastními prostředky

Podobné dokumenty
TÉMATICKÝ OKRUH Softwarové inženýrství

Facade. Známý jako. Účel. Motivace. Facade, Fasáda

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

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

Základy objektové orientace I. Únor 2010

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

Hiearchical MVC (Model-view-controller) vs. PAC (Presentation-abstraction-control)

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 OMO, LS 2014/2015

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

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

Abstraktní datové typy: zásobník

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

PB161 Základy OOP. Tomáš Brukner

Generické programování

Vyřešené teoretické otázky do OOP ( )

Semináˇr Java X J2EE Semináˇr Java X p.1/23

typová konverze typová inference

ČÁST 1. Zahřívací kolo. Co je a k čemu je návrhový vzor 33

Design Patterns. Tomáš Herceg Microsoft MVP (ASP.NET)

DESIGN PATTERNS, PRESENTATION

Výčtový typ strana 67

Komponenty v.net. Obsah přednášky

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

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.

Jazyk C# (seminář 3)

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

Replikace je proces kopírování a udržování databázových objektů, které tvoří distribuovaný databázový systém. Změny aplikované na jednu část jsou

MVC (Model-View-Controller)

Vazba (volná, těsná) - míra znalosti jedné třídy*komponenty o druhé.

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

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

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

Google Web Toolkit. Martin Šurkovský, SUR března Katedra informatiky

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

Plánování a vývoj základního frameworku

Reaktivní programování v.net

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

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

Zpracoval:

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

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

1. Dědičnost a polymorfismus

Programování II. Polymorfismus

Dalším příkladem může být například výstup dat na různá zařízení, souborů, grafických rozhraní, sítě atd.

Programování v Javě I. Leden 2008

Principy objektově orientovaného programování

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

ČESKÉ VYSOKÉ UČENÍ TECHNIKÉ Fakulta elektrotechnická. Microsoft Sharepoint 2007 Workflows Průmyslové informační systémy

Jakub Čermák Microsoft Student Partner

11 Diagram tříd, asociace, dědičnost, abstraktní třídy

Abstract Factory úvod

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

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

Copyright Rudolf Pecinovský, Soubor: 02_Rozhraní x Interfejs.doc, verze , uloženo čt :44 1z 55. Rozhraní. interface (interfejs)

7 Jazyk UML (Unified Modeling Language)

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

Základní datové struktury

7.5 Diagram tříd pokročilé techniky

KAPITOLA 3. Architektura aplikací na frameworku Rails. V této kapitole: modely, pohledy, řadiče.

Vývoj informačních systémů. Architektura, návrh Vzory: Doménová logika

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

Správa paměti. doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 /

Kapitola 1: Úvod. Systém pro správu databáze (Database Management Systém DBMS) Účel databázových systémů

Chain of responsibility

24. listopadu 2013, Brno Připravil: David Procházka

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.

Návrhový vzor Factory v JAVA API

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

Jazyk C# (seminář 6)

Návrh aplikace. Project Westpon. Inteligentní simulátor budov. Martin Mudra, Jan Smejkal, Onřej Macoszek, Marek Žehra, Jiří Slivárich

návrhový vzor Singleton.

Architektura aplikace

IW5 - Programování v.net a C# 4 Pokročilé konstrukce C#

Třída. Atributy. Operace

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

Základní komunikační operace

Infrastruktura UML. Modelování struktury v UML. Superstruktura UML. Notace objektů. Diagramy objektů

Architektura COM. Historie Component Object Model (COM) Komunikace s komponentami Rozhraní komponent COM komponenty v.net.

Softwarové komponenty a Internet

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/

Teoretické minimum z PJV

7 Jazyk UML (Unified Modeling Language)

20. Projekt Domácí mediotéka

CineStar Černý Most Praha

Student s Life. Návrhová dokumentace (Design) Lukáš Barák, Jakub Ječmínek, Jaroslav Brchel, Jiří Zmeškal

Dědění, polymorfismus

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

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

Kolekce, cyklus foreach

UJO Framework. revoluční architektura beans. verze

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

1 Nejkratší cesta grafem

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

Příloha: Dodatečné informace, včetně přesného znění žádosti dodavatele o dodatečné informace

Návrh programu v Black Box Component Builderu s využitím architektury Model View Controller

Dynamické datové struktury IV.

NMIN201 Objektově orientované programování 1 / :36:09

IoC/DI. Tomáš Herceg Microsoft MVP (ASP.NET)

Transkript:

Observer

Observer Klasifikace Object Behavioral Alias Dependents Publish-subscribe Smysl Zavádí možnost sledování změn u objektu tak, že když objekt změní stav, ostatní objekty na tuto změnu zareagují, přičemž nedojde k přímé vazbě od sledovaného objektu k těmto objektům. Potřeba sledování změn objektu a notifikace Mediator málo flexibilní, těsná vazba Událostní řízení řeší observer Obdoba systému událostí (C#, Java) vlastními prostředky

Observer - motivace Při změně dat očekávají oznámení od subjektu, že se mají aktualizovat Udržuje svůj stav a informuje všechny zájemce o jeho změnách

Observer - struktura Účastníci Subject Interface pro udržování seznamu zájemců o upozornění a posílání oznámení Observer Jednoduchý interface pro přijímání upozornění ConcreteSubject Má vlastní funkčnost a stav, rozesílá oznámení o jeho změnách ConcreteObserver Implementuje Observer interface a tak udržuje svůj stav konzistentní se stavem ConcreteSubject

Observer - interakce

Observer - příklad class Class Model Subject + Attach(Observer) + Detach(Observer) : Observer + Notify() : Observer for all o in observers { o->update(this) -observers 1..* Observer + Update(Subject*) ClockTimer DigitalClock AnalogClock + GetHour() + GetMinute() + GetSecond() + Tick() Notify() -subject - _subject: ClockTimer* + Update(Subject*) if (thechangedsubject == _subject) { Draw() - _subject: ClockTimer* + Update(Subject*) if (thechangedsubject == _subject) { Draw() +subject

Příklad - abstraktní třídy class Observer { public: virtual ~ Observer(); virtual void Update(Subject* thechangedsubject) = 0; protected: Observer(); ; class Subject { public: virtual ~Subject(); virtual void Attach(Observer*); virtual void Detach(Observer*); virtual void Notify(); protected: Subject(); private: List<Observer*> *_observers; ; abstraktní třídy, definují rozhraní void Subject::Attach (Observer* o) { _observers->append(o); void Subject::Detach (Observer* o) { _observers->remove(o); void Subject::Notify () { ListIterator<Observer*> i(_observers); for (i.first();!i.isdone(); i.next()) { i.currentitem()->update(this);

Příklad konkrétní třída, uchovává čas, upozorňuje každou sekundu class ClockTimer : public Subject { public: ClockTimer(); virtual int GetHour(); virtual int GetMinute(); virtual int GetSecond(); void Tick(); ; void ClockTimer::Tick () { // aktualizovat vnitřní stav udržující čas //... Notify(); class DigitalClock: public Widget, public Observer { public: DigitalClock(ClockTimer*); virtual ~DigitalClock(); virtual void Update(Subject*); // překrývá operaci třídy Observer virtual void Draw(); // překrývá operaci třídy Widget // definuje, jak vykreslit digitální hodiny private: ClockTimer* _subject; ; konkrétní třída, zobrazuje čas jako digitální hodiny

Příklad DigitalClock::DigitalClock (ClockTimer* s) { _subject = s; _subject->attach(this); DigitalClock:: DigitalClock () { _subject->detach(this); void DigitalClock::Update (Subject* thechangedsubject) { if (thechangedsubject == _subject) { Draw(); před překreslením zkontroluje, že změněný subjekt je subjektem hodin void DigitalClock::Draw () { // načíst hodnoty ze subjektu int hour = _subject->gethour(); int minute = _subject->getminute(); // etc. // nakreslit digitální hodiny

Příklad class AnalogClock : public Widget, public Observer { public: AnalogClock(ClockTimer*); virtual void Update(Subject*); virtual void Draw(); //... ; jako DigitalClock, ale zobrazuje analogové hodiny

Kdy použít Správné rozdělení systému do vrstev Zamezení cyklickým vazbám Odstínění přímého volání sledujícího objektu od sledovaného Více možných pohledů na jeden model, chceme je udržovat konzistentní Objekt, který má informovat nezávislé objekty (publish-subscribe) Změna jednoho objektu vyžaduje změny jiných (neznámých) objektů

Nezávislost mezi subject a observers umožňuje Volně zaměňovat jednotlivé observers nebo subjects Recyklovat observers nebo subjects samostatně Přidávat observers bez změny subject nebo ostatních observers Subject a observers můžou patřit do různých vrstev abstrakce Komunikaci low-level subject s high-level observers Broadcast komunikaci Přidávání a odebírání observers za běhu

Kdy nepoužít Není třeba příliš velká flexibilita Na změnu vždy reagují jasně dané instance bez dalšího možného rozšíření Příme oslovení objektu Př.: Ukládání řádků faktury 1) Bez observeru Faktura při uložení zavolá uložení svým řádkům 2) S observerem Řádky faktury jsou observery pro uložení faktury 2) flexibilní ale velmi netransparentní! Kaskádový Update Update() observeru vyvolá další Notify() a ten další Update() dalších observeru (a ti mají další observery)... Možnost zacyklení událostí Totální nepřehlednost takového systému Chybný design

Implementace - poznámky Úložište Subject si uchováva seznam referencí svých observerů #subjects > #observers Výhodnější použít asoc. pole (např. Hash-table) [key = subject, value = observer] Subject bez observeru nezabíra žádne místo Časově náročnější Pozorování více subjektů Rozšíření rozhraní Update o odkaz na změněný subjekt Aktualizace - volání metody Notify() V Subjectu - ve všech funkcích měnících jeho stav posloupnost více operací = zbytečné volání Notify() Klienti Notify() se volá po sérii změn stavu zodpovědnost, možné chyby Uvolněné odkazy na odstraněné Subjecty Subject při svém odstranění upozorní observers - reset odkazů Obecně nestačí odstranit observers závislost na více subjektech

Implementace - poznámky upřesnění aktualizace v argumentu funkce Update Dva přístupy: model poslání (push) vždy podrobné informace předpoklady o potřebách observeru - menší reusabilita subjektu model stažení (pull) minimum informace Observer si sám řekne o upřesnění důraz na neznalost pozorovatelů menší efektivita explicitní určování zájmových modifikací registrace pozorovatelů jen pro určité události subjekt při události informuje jen ty pozorovatele, kteří mají o událost zájem void Subject::Attach (Observer*, Aspect& interest); void Observer::Update (Subject*, Aspect& interest); registrace pozorovatele upozornění

ChangeManager Registrace observers k subjects pomocí asociatívní třídy - objekt ChangeManager Vazba jako asociativní dvojice subject a observer Použití při složitých závislostech subject-observer Úkoly Mapuje subject na jeho observera Definuje aktualizační strategii Na žádost subject aktualizuje závislé observery instance vzoru Mediator často jeden globální objekt (Singleton) SimpleChangeManager Naivní aktualizuje všechny subjecty každého observeru. DAGChangeManager Udržuje acyklický graf závislostí subject-observer Každý observer obdrží práve jeden update

ChangeManager - příklad abstraktní třída, definuje rozhraní chytrá implementace, grafové závislosti jednoduchá implementace

Observer - známá použití, související NV Známá použití MVC ( Model/View/Controller ) - třída Model odpovídá subjectu, View observeru InterViews - Observer a Observable Andrew Toolkit - "view a "data object" MFC - architektura Document/View java.util.observable implementace pro použití v JDK Java Swing - používá vzor Observer pro event management (EventListener,...) Spring.NET MonoRail ASP.NET Související NV Mediator ChangeManager se chová jako prostředník mezi subjekty a pozorovateli Singleton Implementace ChangeManageru pro zajištění jedinečnosti a globální dostupnosti