APNVZ_01. Návrhové vzory Design Patterns

Podobné dokumenty
Návrhové vzory Design Patterns

Abstraktní datové typy: zásobník

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

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

SW_04. Návrhové vzory (Design Patterns)

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

Z. Kotala, P. Toman: Java ( Obsah )

KTE / ZPE Informační technologie

1. Programování proti rozhraní

Generické programování

Základy objektové orientace I. Únor 2010

RMI Remote Method Invocation

Architektura softwarových systémů

Soubor jako posloupnost bytů

Projekty pro výuku programování v jazyce Java

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

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

Úvod do programovacích jazyků (Java)

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

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

8. přednáška: Soubory a proudy

Java - výjimky. private void vstup() throws IOException {... }

typová konverze typová inference

Typický prvek kolekce pro české řazení

Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám.

Programování v Javě I. Leden 2008

7 Jazyk UML (Unified Modeling Language)

7 Jazyk UML (Unified Modeling Language)

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

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

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

Programování II. Třídy a objekty (objektová orientovanost) 2018/19

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

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

ADMINISTRACE POČÍTAČOVÝCH SÍTÍ. OPC Server

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

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

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

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

Pokročilé programování v jazyce C pro chemiky (C3220) Pokročilá témata jazyka C++

Teoretické minimum z PJV

Programování II. Modularita 2017/18

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ávrh softwarových systémů - architektura softwarových systémů

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

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

Pokročilé typové úlohy a scénáře 2006 UOMO 71

Architektura softwarových systémů

Datové struktury. alg12 1

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

Úvod do programovacích jazyků (Java)

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

Semin aˇr Java V yjimky Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Unor 2008 Radek Koˇc ı Semin aˇr Java V yjimky 1/ 25

20. Projekt Domácí mediotéka

1. Webové služby. K čemu slouží? 2. RPC Web Service. 3. SOA Web Service. 4. RESTful Web services

UJO Framework. revoluční architektura beans. verze

Návrhové vzory OMO, LS 2014/2015

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

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

Výčtový typ strana 67

NetBeans platforma. Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

Dědičnost (inheritance)

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.

MVC (Model-View-Controller)

Algoritmizace a programování

Úvod do programovacích jazyků (Java)

PREPROCESOR POKRAČOVÁNÍ

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

IRAE 07/08 Přednáška č. 1

Vývoj informačních systémů. Přehled témat a úkolů

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

1. Dědičnost a polymorfismus

PŘÍLOHA C Požadavky na Dokumentaci

1 Nejkratší cesta grafem

Obsah. Zpracoval:

public class Karel { private int position; public boolean issmiling; public int getposition() { return position;

Analýza a Návrh. Analýza

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

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

Softwarové komponenty a Internet

Algoritmizace a programování

Algoritmizace, základy programování, VY_32_INOVACE_PRG_ALGO_01

Návrh softwarových systémů - architektura softwarových systémů

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.

11. Dědičnost. Dědičnost strana 103

Design systému. Komponentová versus procesní architektura

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

Informační systémy 2008/2009. Radim Farana. Obsah. Nástroje business modelování. Business modelling, základní nástroje a metody business modelování.

Webové služby a XML. Obsah přednášky. Co jsou to webové služby. Co jsou to webové služby. Webové služby a XML

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

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

Výjimky. v C# a Javě

Technologie Java Enterprise Edition. Přemek Brada, KIV ZČU

Kolekce, cyklus foreach

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

Architektury Informačních systémů. Jaroslav Žáček

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

Vlákno odlehčený proces kód vlákna, zásobník privátní ostatní sdíleno s dalšími vlákny téhož procesu

7.3 Diagramy tříd - základy

10 Balíčky, grafické znázornění tříd, základy zapozdření

Transkript:

APNVZ_01 Návrhové vzory Design Patterns 1

Definice vzoru Každý vzor popisuje problém, který nastává opakovaně v našem prostředí, a potom popisuje podstatu řešení tohoto problému takovým způsobem, že můžete použít řešení milionkrát bez toho, že byste dělali stejnou věc dvakrát. Christopher Alexander 2

Světlo z obou stran každého pokoje Když mají lidé na výběr, vždy tíhnou k takovým pokojům, do kterých přichází přirozené světlo alespoň ze dvou stran. Při projektování domu, je nejlepší umístit každý pokoj tak, aby měl vnější prostor alespoň ze dvou stran, s dostatkem oken, které by zachycovaly přirozené světlo více než z jednoho směru. 3

Literatura Gamma E., Helm R.: Degign Patterns. Addison -Wesley 1995 (český překlad Návrh programů pomocí vzorů. Grada 2003) 4

Základní literatura Pecinovský R.: Návrhové vzory. Computer Press 2007 Bruce Eckel: Thinking in Patterns. www.bruceeckel.com Buchmann F.: Pattern-Oriented Software Architecture A System of Patterns. Willey 1998 Metsker S.J. Wake W.C.: Design Patterns in Java. Addison-Wesley. 2006 Freeman, E. Head First Design Patterns. O REILLY 2004 5

Existující knihy k Business Patterns 6

Úvod Vzory pro návrh, návrhové vzory (Design Patterns) souvislost s objektově orientovanou analýzou a návrhem. Klíčový poje znovupoužitelnost (reusability) Znovupoužitelnost v oblasti objektově orientovaných jazyků části software, které se použijí buď přímo, nebo po malém přizpůsobení využívá se dědičnosti. Návrhové vzory pomáhají rozvíjet objektově orientované myšlení. 7

Úvod Znovupoužitelnost je v oblasti objektově orientovaných jazyků použita na úrovni implementace zdrojového kódu. Vzory pro návrh vycházejí z práce zkušeného návrháře, ten nezačíná svoji práci od nuly, ale pokud se mu nějaký způsob řešení osvědčil snaha používat ho znovu a vylepšovat ho. Znovupoužitelnost v oblasti návrhových vzorů znamená znovupoužití znalostí získaných v průběhu návrhu. 8

Úvod Znovupoužitelnost je možné chápat v několika úrovních: dědičnost a business objekty (aplikační objekty) znovupoužitelnost na implementační úrovni návrhové vzory znovupoužitelnost v oblasti návrhu nabytých znalostí 9

Co je vzor Vzor určuje opakující se (opětovný) návrh problému, který vzniká ve specifických situacích a presentuje nějaké jejich řešení. Vzory reprezentují existující, dobře prověřené zkušenosti návrhu. Vzory identifikují a specifikují abstrakce, které jsou nad úrovní jednotlivých tříd a instancí nebo komponent. Vzory poskytují společný slovník a pochopení principů návrhu. 10

Co je vzor Vzory jsou prostředky pro dokumentaci softwarové architektury. Vzory pomáhají obsáhnout složitost software a umožňují srozumitelnost a pochopitelnost software. 11

Co je návrhový vzor Návrhový vzor je libovolná znalost, která vznikla při návrhu programového systému abstrakcí od specifických konkrétních podmínek. Nutno doplnit konkrétní fyzickou podobu takovéto znalosti. Forma zápisu vzoru pro návrh není pevně daná, je závislá na tom, čeho se zkušenost kterou chceme vyjádřit návrhovým vzorem týká. 12

Forma zápisu Model použitý při návrhu potřebuje slovní komentář, který přesněji specifikuje použité prvky a vazby v modelu a umožní pochopení problému. Nejdůležitějšími charakteristikami tohoto popisu kromě jiných bývají: kontext situace, která způsobuje vznik problému, problém opakující se problém vznikající v daném kontextu, řešení prověřené řešení problému (někdy alespoň částečné). 13

Kontext, problém a řešení kontext: vytvoření programového vybavení s uživatelským grafickým rozhraním problém: obyčejně je problém reprezentovaný množinou někdy protichůdně působících sil např.: uživatelské rozhraní by mělo být snadno modifikovatelné, funkční jádro programového vybavení by nemělo být postiženo změnou uživatelského rozhraní. 14

Kontext, problém a řešení obecně síly pomáhají objasnit problém řešení z různých úhlů pohledu a pomáhají tak mu porozumět ve všech detailech, síly mohou působit doplňkově nebo protichůdně. řešení: ukazuje, jak řešit opakující se problém nebo lépe, jak vyrovnat síly, s ním sdružené. 15

Řešení v softwarové architektuře řešení zahrnuje dva aspekty: 1. Každý vzor specifikuje jistou strukturu a prostorovou konfiguraci prvků. Řešení naznačeného problému je v rozdělené aplikace na vlastní zpracování, vstupy, výstupy (MVC). To představuje statickou stránku (strukturu) řešeného problému. 2. Každý vzor specifikuje chování za běhu (run-time). Např. MVC controller dostane vstup od myši, klávesnice. Událost je transformována na požadavky služeb. 16

Řešení Tyto požadavky služeb jsou zaslány buď modelu nebo pohledům. Chování za běhu reprezentuje dynamickou stránku řešení problému. Jak účastníci spolupracují, jak je organizována práce mezi nimi? 17

Příklad Před popisem vzoru je třeba vzor identifikovat a abstrahovat od konkrétností. Při návrhu konkrétní aplikace se objevují některé analogie mezi chováním vytvářených objektů (mají shodné stavy a přechody), jejich vazbami na okolní objekty (vystupují v podobných rolích). 18

Cesty jak odhalit NV (DP) Postup, který zachycuje vztahy mezi skupinami rolí objektů. Např. benzínová pumpa objekty: zákazník role kupujícího benzínová pumpa role prodejce auto role příjemce Abstrakcí od detailů dojdeme k návrhu obecného vzoru prodeje (orientujeme se na role). 19

Cesty jak odhalit NV (DP) Pro prodej, kýmkoli realizovaný, je typické výskyt tří rolí: prodejce kupující příjemce Zaznamenáním vzájemného vztahu a operací probíhajících mezi těmito třemi aktéry (actors), vzniká návrhový vzor. Obecný vzor prodeje je potom možné aplikovat na jakýkoli prodej. 20

Formalizace popisu řešení CRC card Class Responsibility Collaborators Class třída, její název Responsibilities funkčnost, zodpovědnost Collaborators spolupracující třídy, komponenty Jiná grafická notace než UML UML grafická notace 21

Popis vzoru Kromě kontextu, problému a řešení diagramy a scénáře k zachycení statické a dynamické stránky řešení; varianty vzoru jméno a další aliasy struktura implementace příklady řešení výhody/ nevýhody vazby na další vzory 22

Vzor architektury vrstvy (Layers) Vzor Vrstvy (Layers) pomáhá strukturovat aplikace, které mohou být dekomponovány na skupiny podúloh, ve kterých každá skupina podúloh je na dané úrovni abstrakce. Nejznámějším příkladem architektury vrstev jsou síťové protokoly. Protokol se skládá z množiny pravidel a konvencí, které popisují, jak počítačové programy komunikují přes hranice počítačů. Je definován formát, obsah a význam zpráv. 23

Vzor architektury vrstvy (Layers) Protokol specifikuje dohody v množství abstraktních úrovní, začínající od přenosu bitů, až po nejvyšší úroveň aplikační logiky. 24

Vzor architektury vrstvy (Layers) Přístup po vrstvách je považován za lepší než implementace protokolu jako monolitického bloku, protože implementace koncepčně odlišných problémů odděleně přináší několik výhod např. podpora pro týmovou práci, podpora inkrementálního programování. FTP FTP protokol FTP TCP protokol TCP TCP IP protokol IP IP Ethernet Ethernet Fyzické propojení Ethernet 25

Kontext Rozsáhlý systém vyžadující dekompozici. Problém Navrhujeme systém, jehož dominantní charakteristikou je kombinace nízko a vysoko úrovňových problémů. Vysoce úrovňové operace závisí na nízko úrovňových. Typickým vzorem komunikačního toku požadavků je, že se pohybují z vysoko úrovňových k nízko úrovňovým. Odpovědi na tyto dotazy mají směr opačný. 26

Problém V takovém případě potřebujeme dát do rovnováhy následující síly: pozdější změny kódu by neměly ovlivňovat celý systém. Měly by být svázány s jednou vrstvou. stabilní interface, části systému by měly být zaměnitelné, Komponenty by měly mít možnost nahradit alternativní implementace bez účinku na zbytek systému. neexistuje žádná standardní granularita složité komponenty vyžadují další dekompozici 27

Řešení Z nejvyšší úrovně je řešení velmi jednoduché. Strukturujte systém do vhodného počtu vrstev a umístěte je na vrchol každé předcházející. Začněte nejnižší vrstvou abstrakce. Postupujte směrem nahoru od J-1 vrstvy k vrstvě J, až dosáhnete vrcholu. Většina služeb, které vrstva J poskytuje jsou složené služby poskytované vrstvou J-1. 28

Řešení Hlavní zásadou struktury tohoto vzoru je, že služby Vrstvy_J jsou pouze použity Vrstvou J+1. Neexistuje žádná další závislost mezi vrstvami. Tato struktura může být srovnatelná se zásobníkem. Každá konkrétní vrstva chrání nižší vrstvy od přímého přístupu některé z vyšších vrstev. Klient Vrstva N nejvyšší úroveň abstrakce Vrstva N-1 Vrstva 1 nejnižší úroveň abstrakce 29

Scénáře použití 1. Klient zadává dotaz nejvyšší vrstvě N. Protože tato vrstva nemůže požadavek kompletně splnit, obrací se na vrstvu N-1. Ta pošle další dotaz vrstvě N-2 a tak to pokračuje až k vrstvě 1. Tam jsou vykonány služby na nízké úrovni. Je-li třeba, odpovědi na různé dotazy jsou předány do vrstvy 2, z vrstvy 2, pak do vrstvy 3, až se konečně dostanou k vrstvě N. Je to tzv. top-down komunikace. 30

Scénáře použití 2. Tento scénář ilustruje bottom-up komunikaci. Např. když driver zařízení detekuje vstup: začíná se od vrstvy 1. pak se pokračuje vrstvou 2, až se dosáhne nejvyšší vrstvy N. 31

Scénáře použití 3. Tento scénář popisuje situaci, kdy požadavky prochází pouze podmnožinou vrstev. Např. požadavek na nejvyšší úrovni postoupí k úrovni N-1, pokud tato úroveň uspokojí jeho požadavek, dál se již nepokračuje. Příkladem může být cache. 4. Tento scénář je podobný předchozímu jen s tím rozdílem, že se začíná od nejnižší vrstvy a pokračuje se pouze nejvyšší nutné vrstvě. 32

Scénáře použití 5. Zahrnuje dva zásobníky komunikujících vrstev. Tento scénář je známý z komunikačních protokolů, kde jsou zásobníky známé jako zásobníky protokolů. 33

Implementace 1. Definovat abstraktní kritérium pro seskupení úloh do vrstev. 2. Stanovit počet abstraktních úrovní podle vašeho abstrakčního kritéria. Každá abstrakční úroveň koresponduje s jednou vrstvou vzoru. 3. Pojmenovat vrstvy a přiřadit úlohy ke každé z nich. 4. Specifikovat služby jednotlivých vrstev. 5. Zjemnit vrstvení. 6. Specifikovat rozhraní pro každou vrstvu. 7. Navrhnout strategii ošetření chyb. 34

Varianty Relaxed Layered System je méně restriktivní co se týká vztahů mezi vrstvami. V této variantě může každá vrstva využívat služeb libovolné nižší vrstvy. Může také existovat varianta, kdy jednotlivé vrstvy mohou zviditelnit některé služby pro libovolnou z vyšších vrstev a naopak některé služby poskytovat pouze pro nejbližší vyšší vrstvu. 35

Varianty Layered Through Inheritance je varianta, která se nachází v některých objektově orientovaných systémech. V této variantě jsou nižší vrstvy implementovány jako základní třídy. 36

Známé aplikace Virtuální stroje. Příkladem může být Java Virtual Machine (JVM) definující formát binárního kódu. Protože je JVM je závislý na softwarové platformě, existují různé JVM pro různé operační systémy a procesory. APIs- Application Programming Interface rozhraní aplikačních programů. API je obyčejně kolekce funkčních specifikací (volání systémových funkcí). 37

Známé aplikace Informační systém IS. Rovněž informační systémy bývají vytvářeny pomocí architektury založené na vrstvách. 38

Výhody Znovupoužitelnost vrstev, dá se využít v případě dobře definované abstrakce a dobře definovaného a dokumentovaného rozhraní. Podpora standardizace. Jasně definované a všeobecně akceptované úrovně abstrakce umožňují rozvoj standardizovaných úloh a rozhraní. Závislosti jsou lokální. Standardizované rozhraní mezi vrstvami obyčejně omezuje změnu kódu pouze na danou vrstvu. Zaměnitelnost. Daná implementovaná vrstva může být zaměněna sémanticky ekvivalentní implementací bez velkého úsilí. 39

Slabá místa Kaskádní změny chování může nastat při změně chování dané vrstvy. Nízká efektivnost. Architektura založená na vrstvách je obyčejně méně efektivní než monolitická. Problémy se stanovením správné granularity vrstev. 40

Roury a filtry Pipes and Filters Návrhový vzor roury a filtry poskytuje strukturu pro systémy, které zpracovávají tok dat (a stream of data). Každý krok zpracování je zapouzdřen v komponentě nazývané filtr. Data jsou posílána prostřednictvím rour (pipes) mezi sousedními filtry. Kombinace filtrů a rour dovoluje vytvořit řadu podobných systémů. 41

Kontext Zpracování datových toků. 42

Problém Je třeba vytvořit systém, který musí zpracovat a transformovat tok vstupních dat. Implementace takového systému jako jednotné komponenty není možné z několika důvodů: systém bude vytvořen několika vývojáři, úloha se přirozeně rozpadá do několika procesních stavů, je pravděpodobné, že se požadavky budou měnit. 43

Požadavky Budoucí rozšíření systému by mělo být možné změnou procesních kroků, nebo rekombinací kroků, které si je schopen provést i sám uživatel. Malé procesní kroky je snadné použít znova v odlišném kontextu, než velké komponenty. Procesní kroky, které bezprostředně na sebe nenavazují, spolu nesdílejí informace. 44

Požadavky Zda-li je separace procesních kroků řešitelná, silně závisí na aplikační doméně a problému, který má být řešen. Např. interaktivní, událostmi řízený systém je nemožné rozdělit do sekvenčních kroků. 45

Řešení Architektonický vzor roury a filtry dělí řešenou úlohu do několika sekvenčních, procesních kroků. Tyto kroky jsou spojeny pomocí datových toků (rour) do systému, kde výstupní data daného procesního kroku jsou vstupem do následujícího procesního kroku. Každý procesní krok je implementován jako komponenta filtr. 46

Řešení Filtr konzumuje a dodává data inkrementálně nejdříve spotřebuje celý vstup dat, než vytvoří jakýkoli výstup. Vstupem do takového systému je datový zdroj, jako např. textový soubor, výstupem data sink jako např. soubor, nebo terminál, či animační program. Datový zdroj, datový výstup a filtry jsou spojeny sekvenčně rourami. Každá roura implementuje datový tok mezi přilehlými procesními kroky. 47

Struktura Daný filtr může být kombinací libovolných z těchto základních principů: následující prvek si tahá výstupní data z filtru pull varianta, předchozí prvek tlačí vstupní data do filtru push varianta, nejběžnější, filtr je aktivní ve smyčce tahá si vstupní data a tlačí výstupní data pro další zpracování pull-push varianta. 48

Sekvenční diagram varianty pull Data Source Filter 1 pull Filter 2 pull Data Sink pull read read read f1 data f2 data 49

Sekvemční diagram varianty push Data Source push Filter 1 push Filter 2 push Data Sink write f1 write f2 write 50

Použití rour při V/V operacích mezi vlákny Pro vlákna bývá užitečné spolu komunikovat s využitím I/O operací. Knihovny pro vlákna poskytují podporu pro vnitro vláknové I/O operace formou rour (pipes). Třída PipedWriter umožňuje vláknu zapisovat do roury. Třída PipedReader dovoluji jinému vláknu číst ze stejné roury. 51

Použití rour při V/V operacích mezi vlákny Je možné se na to dívat jako na variace problému producent/konsument, kde roury představují zakonzervované řešení. 52

// Nastaví časový limit vykonávání programu Poznámky import java.util.*; public class Timeout extends Timer { public Timeout(int delay, final String msg) { super(true); // Daemon thread schedule(new TimerTask() { public void run() { System.out.println(msg); System.exit(0);, delay); 53

// Použití rour pro vnitro vláknové I/O operace Poznámky import java.io.*; import java.util.*; class Sender extends Thread { private Random rand = new Random(); private PipedWriter out = new PipedWriter(); public PipedWriter getpipedwriter() { return out; public void run() { while(true) { for(char c = 'A'; c <= 'z'; c++) { try { out.write(c); sleep(rand.nextint(500)); catch(exception e) { throw new RuntimeException(e); 54

class Receiver extends Thread { private PipedReader in; public Receiver(Sender sender) throws IOException { in = new PipedReader(sender.getPipedWriter()); public void run() { try { while(true) { // blokuje, dokud nepřijdou znaky: // výpis znaků System.out.println("Read: " + (char)in.read()); catch(ioexception e) { throw new RuntimeException(e); Poznámky // hlavní metoda public class PipedIO { public static void main(string[] args) throws Exception { Sender sender = new Sender(); Receiver receiver = new Receiver(sender); sender.start(); receiver.start(); new Timeout(4000, "Terminated"); 55

Read: A Read: B Read: C Read: D Read: E Read: F Read: G Read: H Read: I Terminated Read: J Read: K Read: L Read: M Read: N Poznámky 56

Implementace Implementace rour a filtrů je přímá. 1. Rozdělit systémové úlohy do sekvencí procesních kroků. Každý takový procesní krok musí záviset pouze na výstupu z předchozího procesního kroku. 2. Definovat datový formát, který bude přenášen rourami. 3. Rozhodnout, jak implementovat každé spojení rour. 4. Navrhnout a implementovat filtry. 5. Navrhnout zpracování chyb. 57

Výhody Nejsou třeba žádné mezi soubory, ale jsou možné. Flexibilita je umožněna výměnou filtrů. Flexibilita rekombinace. To umožňuje vytvořit novou zpracovávající sekvenci změnou filtrů, nebo přidáním dalších filtrů. Opakované využití komponenty filtru. Rychlé prototypování. 58

Slabá místa Sdílení stavových (globálních) informací je nákladné a nepružné. Poněkud složité zpracování chyb. 59

Shrnutí Návrhový vzor roury a filtry slouží ke strukturování systémů, které zpracovávají toky dat. Příkladem mohou být překladače, toky dat příkazů atd. Můžeme se s ním také setkat v aplikacích, které převádějí danou strukturu dat na jinou a k tomu využívají XML. 60

Singleton deklarace třídy singletonu final deklarace všech konstruktorů private deklarace třídní proměnné odkazující se na singleton deklarace metody getinstance(), getreference(), getconnection() singleton ve společné oblasti pool např. pro připojení databáze pouze stanovený počet instancí 61

public interface Connection { Object get(); void set(object x); Poznámky public class ConnectionImplementation implements Connection { private Object obj; public Object get() { Object result; result = obj; obj = null; return result; public void set(object s) { ConnectionPool.checkConnection(this); obj = s; public class EmptyPoolException extends Exception { public EmptyPoolException(String s){ super(s);

public class ConnectionPool { //A singleton private static PoolManager pool = new PoolManager(); //private static PoolManager pool; /* public static PoolManager getinstance(){ if(pool == null) pool = new PoolManager(); return pool; // not used declaration - getconnection is the access method */ Poznámky public static void addconnections(int number) { for(int i = 0; i < number; i++) pool.add(new ConnectionImplementation(), i+1); public static Connection getconnection() throws EmptyPoolException { return (Connection)pool.get(); public static void releaseconnection(connection c) { pool.release(c); public static void print() { pool.print(); public static void checkconnection(connection c){ pool.checkconnection(c);

public class PoolManager { private ArrayList<PoolItem> items = new ArrayList<PoolItem>(); Poznámky public void add(connection item, int id) { items.add(new PoolItem(item, id)); public Connection get() throws EmptyPoolException { for (int i = 0; i < items.size(); i++) { PoolItem pitem = items.get(i); if (pitem.getinuse() == false) { pitem.setinuse(true); return pitem.getitem(); // Fail early: throw new EmptyPoolException(" No Free Connection "); // return null; // Delayed failure public void release(connection item) { for (int i = 0; i < items.size(); i++) { PoolItem pitem = (PoolItem) items.get(i); if (item == pitem.getitem()) { pitem.setinuse(false); item = null; return; throw new RuntimeException(item + " not found");

public void checkconnection(connection item) { for (int i = 0; i < items.size(); i++) { PoolItem pitem = (PoolItem) items.get(i); if (item == pitem.getitem() && pitem.getinuse() == false) throw new RuntimeException(item + " out of function - released "); Poznámky public void print() { for (int i = 0; i < items.size(); i++) { System.out.println(items.get(i).toString());

public class PoolItem { private boolean inuse = false; private int ident; // connection private Connection item; // konstruktor public PoolItem(Connection item, int i) { this.item = item; ident = i; public boolean getinuse() { return inuse; public void setinuse(boolean b1) { inuse = b1; public int getident() { return ident; public Connection getitem() { return item; public void setitem(connection cn) { item = cn; public String tostring() { return String.format("ident: %d inuse: %s", getident(), getinuse()? "true" : "false"); public void print() { System.out.println(this.toString()); Poznámky

public class TestClass { private String name; private int number; private double bignumber; public TestClass(String nm, int c1, double c2) { name = nm; number = c1; bignumber = c2; public String getname() { return name; public int getnumber() { return number; public double getbignumber() { return bignumber; public String tostring() { return String.format("%s %s %d %.2f", getclass().getname(), getname(), getnumber(), getbignumber()); public void print() { System.out.println(this.toString()); Poznámky

public class ConnectionPoolDemo { public static void main(string[] args) { ConnectionPool.addConnections(3); TestClass t1; ConnectionPool.print(); Connection c = null; try { c = ConnectionPool.getConnection(); Poznámky catch (EmptyPoolException e) { //PoolManager.EmptyPoolException e //throw new RuntimeException(e); System.err.printf("EmptyPoolException %s\n", e); // checking connection the line 11 with line 12 if(c!= null) { c.set(new TestClass("Prvni", 22, 19.458)); t1 = (TestClass) c.get(); // mock operations t1.print(); ConnectionPool.print(); //ConnectionPool.releaseConnection(c); Connection c1 = null; try { c1 = ConnectionPool.getConnection(); c1.set(new TestClass("Druhy", 25, 589.78)); t1 = (TestClass) c1.get(); t1.print(); catch (EmptyPoolException e) { //throw new RuntimeException(e); System.err.printf("EmptyPoolException %s\n", e);

ConnectionPool.print(); Poznámky Connection c2 = null; try { c2 = ConnectionPool.getConnection(); c2.set(new TestClass("Treti", 33, 689.55)); //c.set(new TestClass("Treti", 33, 18.2); zpusobi chybu t1 = (TestClass)c2.get(); t1.print(); catch (EmptyPoolException e) { //throw new RuntimeException(e); System.err.printf("EmptyPoolException %s\n", e); ConnectionPool.releaseConnection(c); ConnectionPool.print(); //ConnectionPool.releaseConnection(c); //ConnectionPool.releaseConnection(c2);

Connection c3 = null; try { c3 = ConnectionPool.getConnection(); c3.set(new TestClass("Treti", 45, 189.357)); t1 = (TestClass)c3.get(); t1.print(); catch (EmptyPoolException e) { //throw new RuntimeException(e); System.err.printf("EmptyPoolException %s\n", e); ConnectionPool.print(); //ConnectionPool.releaseConnection(c1); ConnectionPool.print(); Connection c5 = null; ConnectionPool.releaseConnection(c); ConnectionPool.print(); try { c5 = ConnectionPool.getConnection(); c5.set(new TestClass("Paty", 458, 387.357)); t1 = (TestClass)c5.get(); t1.print(); catch (EmptyPoolException e) { //throw new RuntimeException(e); System.err.printf("EmptyPoolException %s\n", e); ConnectionPool.print(); Poznámky