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



Podobné dokumenty
Základy objektové orientace I. Únor 2010

Abstract Factory úvod

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

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

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

Generické programování

typová konverze typová inference

1. Dědičnost a polymorfismus

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

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

20. Projekt Domácí mediotéka

Návrhové vzory OMO, LS 2014/2015

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

Abstraktní třída a rozhraní

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

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

Výčtový typ strana 67

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

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

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.

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

Výchozí a statické metody rozhraní. Tomáš Pitner, upravil Marek Šabo

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

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

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

Seminář Java IV p.1/38

1. Programování proti rozhraní

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

Teoretické minimum z PJV

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

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

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

Programování II. Úvod do dědičnosti 2018/19

Jazyk C# (seminář 3)

7.5 Diagram tříd pokročilé techniky

Úvod do programovacích jazyků (Java)

Dědění, polymorfismus

Zpracoval:

Jazyk C# (seminář 6)

Úvod - problém. Při přidání nového modelu je nutné upravit. Kód, který se nebu de často měnit. n Mějme obchod s auty:

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

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

Aplikace s grafickým uživatelským rozhraním

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

Chování konstruktorů a destruktorů při dědění

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

3. Je defenzivní programování technikou skrývání implementace? Vyberte jednu z nabízených možností: Pravda Nepravda

Objektové programování

7.5 Diagram tříd pokročilé techniky

Dědičnost. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 23.března

Dědičnost (inheritance)

Chain of responsibility

Seminář Java II p.1/43

Objekty v PHP 5.x. This is an object-oriented system. If we change anything, the users object.

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

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

Obsah. October 2, Polymorfizmus. Typologie testování. Problém polymorfizmu. Vady/Anomálie. Vazební sekvence ČVUT FEL, K13132

NPRG031 Programování II 1 / :25:46

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.

PREPROCESOR POKRAČOVÁNÍ

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

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

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

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

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

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

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

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

9. Polymorfismus a rozhraní

Programování v Javě I. Leden 2008

7 Jazyk UML (Unified Modeling Language)

Remote Method Invocation RMI

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

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

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

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

Principy objektově orientovaného programování

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

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

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.

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

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

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ

10 Generické implementace

návrhový vzor Singleton.

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

Programování II. Polymorfismus

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

JAVA JavaBeans Java, letní semestr

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

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

7 Jazyk UML (Unified Modeling Language)

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

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

Programovací jazyk Java

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

8. GRAFICKÉ UŽIVATELSKÉ ROZHRANÍ

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

Transkript:

Bridge

Bridge Známý jako Handle/Body Účel odděluje abstrakci (rozhraní a jeho sémantiku) od její konkrétní implementace předchází zbytečnému nárůstu počtu tříd při přidávání implementací používá se v době návrhu Použitelnost odstranění vazby mezi abstrakcí a její implementací abstrakci a implementaci lze nezávisle rozšiřovat umožňuje měnit používanou implementaci dle potřeby skrytí detailů implementace při změně implementace netřeba překompilovat klientský kód

Bridge motivace Příklad: multiplatformní systém pro tvorbu grafického uživatelského rozhraní nešikovné řešení: abstraktní třída reprezentující komponentu rozhraní, pro každou platformu jeden konkrétní potomek abstraktní třída Window reprezentující okno rozhranní, pro každou platformu jeden konkrétní potomek (XWindow, PMWindow) důsledkem je zbytečný nárůst počtu tříd klientský kód je závislý na platformě (jeho autor musí explicitně uvést použitou implementaci) mimo to můžeme chtít různé typy oken hlavní okno, dialogové okno, apod. odvozené typy oken je nutné implementovat pro XWindow i PMWindow.

Bridge motivace Příklad: multiplatformní systém pro tvorbu grafického uživatelského rozhraní lepší řešení: vytvoříme dvě hierarchie tříd 1. hierarchie: typy oken (IconWindow, TransientWindow), bázovou třídou je třída Windows 2. hierarchie: implementace okna (XWindowImp, PMWindowImp), bázovým rozhraním (příp. abstraktní třídou) je WindowImp třída Window bude obsahovat referenci na objekt typu WindowImp metody ve třídě Window a jejích potomcích budou implementovány pomocí metod rozhraní WindowImp jednotné abstraktní rozhraní pro typy oken jednotné abstraktní rozhraní pro implementace okna metody implementovány pomocí metod rozhraní konkrétní typy oken konkrétní implementace

Struktura Bridge struktura typicky obsahuje jen primitivní operace Účastníci Abstraction definuje rozhraní objektů, obsahuje odkaz na implementaci metody realizovány pomocí metod rozhraní Implementor Implementor představuje rozhraní implementací, rozhraní se může lišit od Abstraction RefinedAbstraction rozšiřuje rozhraní definované v Abstraction ConcreteImplementor konkrétní implementace rozhraní Implementor

Bridge důsledky Obecné vlastnosti odděluje rozhraní a implementaci implementace není vázána na rozhraní, stačí implementovat jen primitivní operace lepší rozšiřitelnost obě hierarchie lze rozšiřovat nezávisle silnější skrytí implementace vede k lépe strukturovanému objektovému návrhu Flexibilita přidání implementace snadné, přidáme kód implementace a při vytváření implementace (v konstruktoru Abstraction nebo v Abstract Factory) to zohledníme přidání nového potomka Abstraction ještě jednodušší, pouze napíšeme novou třídu dědící od Abstraction přidání potomka, který vyžaduje novou funkci složitější, nutno do všech implementací přidat žádanou funkci a přidat kód potomka změny v kódu jsou na dobře definovaných místech

Bridge použití Kdy je vhodné použít Bridge? nechceme, aby rozhraní a implementace byli pevně svázány můžeme chtít vybrat konkrétní implementaci za běhu chceme rozšiřovat rozhraní pomocí dědičnosti a zároveň přidávat nové implementace Bridge umožní obě tyto věci provádět nezávisle chceme, aby změny v implementaci neměly vliv na klientský kód aby se tento nemusel při změně implementace rekompilovat chceme skrýt detaily implementace v C++ se i privátní členské proměnné a metody píší do hlavičkového souboru chceme sdílet implementaci mezi více objekty a nechceme, aby o tom klient věděl

Bridge implementace Varianty jeden Implementor stačí jedna konkrétní třída Implementor (nepotřebujeme abstraktního předka) účelem je skrytí detailů implementace (třída Abstraction bude obsahovat pouze referenci na objekt třídy Implementor, jinak nepotřebuje žádné jiné soukromé atributy) pokud se změní implementace, není třeba rekompilovat klientský kód více Implementatorů Implementor se vybere v konstruktoru Abstraction konstruktor lze parametrizovat klient může říct, jakou implementaci použít Implementor se vybere za běhu, lze ho za běhu dokonce změnit implementaci může vytvářet i Abstract Factory sdílení Implementatorů Implementor je sdílen více objekty, tj. více objektů třídy Abstraction obsahuje referenci na tentýž objekt třídy Implementator v C++ je potřeba použít počítání odkazů (reference counting) aby mohl být objekt třídy Implementator zrušen v případě že na něj nikdo neodkazuje

Bridge příklad Příklad: multiplatformní systém pro tvorbu grafického uživatelského rozhraní rozhraní objektů public abstract class Window { private WindowImp imp; public abstract void DrawContents(); implementace pomocí volání metody na konkrétní implementaci public void DrawRect(Point p1, Point p2) { WindowImp imp = getwindowimp(); imp.devicerect(p1.getx(), p1.gety(), p2.getx(), p2.gety()); protected WindowImp getwindowimp() { if (imp == null) { imp = WindowSystemFactory.getInstance.makeWindowImp(); return imp; inicializace na žádost rozšířené rozhraní public class IconWindow extends Window { public void DrawContents() { WindowImp imp = getwindowimp(); imp.devicebitmap( icon, new Coord(0.0), new Coord(0.0));

Bridge příklad Příklad: multiplatformní systém pro tvorbu grafického uživatelského rozhraní rozhraní implementací poskytuje primitivní metody pro vykreslování public interface WindowImp { void DeviceRect(Coord c1, Coord c2, Coord c3, Coord c4); void DeviceText(String string, Coord c1, Coord c2); void DeviceBitmap(String string, Coord c1, Coord c2);... implementace třídy XWindow a PMWindow implementující rozhraní WindowImp, poskytují konkrétní primitivní kreslící funkce mohou obsahovat privátní atributy určující stav okna public class XWindowImp implements WindowImp { public void DeviceRect(Coord c1, Coord c2, Coord c3, Coord c4) {...... public class PMWindowImp implements WindowImp { public void DeviceRect(Coord c1, Coord c2, Coord c3, Coord c4) {......

Bridge praktické příklady použití Java Abstract Window Toolkit (AWT) na platformě nezávislý okenní systém toolkit pro vytváření na platformě nezávislého GUI třídy reprezentující komponenty grafického uživatelského rozhraní abstraktní třída Component odvozené třídy reprezentují konkrétní komponenty rozhraní ComponentPeer definuje operace pro vykreslování komponent implementující třídy - vykreslování komponent na konkrétní platformě abstraktní továrna Toolkit konkrétní továrny odvozené od této třídy vytvářejí objekty pro konkrétní platformu podpora nové platformy vytvořit třídy implementující rozhraní ComponentPeer a jeho potomky implementovat továrnu odvozené od třídy Toolkit

Bridge praktické příklady použití Java Database Connectivity (JDBC) připojení do databáze JDBC používá návrhový vzor Bridge k implementaci připojení do databáze třída Connection reprezentuje připojení k databázi, které dále využívá klientský kód pro přístup k databázi rozhraní Driver reprezentuje obecný ovladač realizující připojení k databázi existují implementace tohoto rozhraní pro různé databázové systémy, tyto typicky dodávají výrobci těchto systémů Abstraction Factory DriverManager inicializuje objekt třídy Connection a předá jí referenci na instanci zvoleného ovladače, tedy objekt třídy implementující rozhraní Driver změna databáze znamená pouze výměnu ovladače použitý ovladač je možné zvolit za běhu aplikace

Bridge související návrhové vzory Související návrhové vzory Abstract Factory vytváří instance implementací viz java.awt.toolkit, java.sql.drivermanager Adapter stejně jako Bridge implementuje rozhraní jedné třídy pomocí metod jiné třídy používá se v případě, že chceme nějakou již existující třídu přizpůsobit požadovanému rozhraní tato třída má jiné rozhraní, než by se nám hodilo Bridge se používá už v době návrhu tříd