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.

Slides:



Advertisements
Podobné prezentace
ÚVOD DO C++ 3 TŘÍDY a objekty - POKRAČOVÁNÍ
Advertisements

Seminář C++ 5. cvičení Dědičnost Ing. Jan Mikulka.
Funkce Připomeňme si program pro výpočet faktoriálu:
Pole, ukazatele a odkazy
BLIŽŠÍ POHLED NA TŘÍDY, DĚDIČNOST - úvod
Uživatelská rozhraní Uživatelská rozhraní 9. cvičení.
1NPRG054 Vývoj vysoce výkonného software /2013 David Bednárek Domácí úkol.
Singleton 1 1.
C++ Přednáška 3 Konstantní a statické členy tříd, ukazatel this, konstantní instance třídy Ing. Jiří Kulhánek , kat. 352, VŠB TU Ostrava 2004.
Preprocess Úvod do tvorby funkcí Princip preprocesoringu Direktivy preprocesoru Podmíněný překlad Základy tvorby funkcí Zjednodušený popis principu předávaní.
Čtvrté cvičení Objektové programování Objektový model v Javě
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
Seminář C++ 9. cvičení Šablony Ing. Jan Mikulka. Šablony ► template – vzory, podle kterých může překladač tvořit skupiny podobných tříd nebo funkcí, které.
Ing. Josef Veselý Označení šablony a vzdělávací sady viz.rozpis.
PB161 Jmenné prostory, I/O proudy PB161 | Jmenné prostory, IO proudy PB161 – Programování v jazyce C++ Objektově Orientované Programování.
Adapter. Adapter – pojem Součástka navržená k propojení dvou „nekompatibilních“ zařízení Definice slova podle Cambridge Advanced Learner's Dictionary:
Objektové orientované programování Objektově orientované problémy v PHP Lukáš Masopust 2008.
Ing. Josef Veselý Označení šablony a vzdělávací sady viz.rozpis.
Dynamická alokace, polymorfismus
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.
PRÁCE S VLÁKNY A APLIKAČNÍ DOMÉNY V.NET FRAMEWORK APLIKACÍCH Architektura technologie.NET Jan Martinovič, FEI - Katedra Informatiky.
Strategy. Strategy – „All-in-1“ na začátek class AStrategy { public: virtual void Algorithm()=0; protected: AStrategy(); }; class SpecificStrategy: public.
Seminář C++ 4. cvičení Objekty Ing. Jan Mikulka. Co je objekt ► obraz třídy i instance ► třída – definovaná za pomocí klíčového slova class ► instance.
PB161 Právo friend, přetěžování operátorů, přetypování PB161 | Friend, operátory PB161 – Programování v jazyce C++ Objektově Orientované Programování.
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.
PB161 Principy OOP - rozhraní, dědičnost PB161 | Principy OOP - Dědičnost, rozhraní
IB111 Programování a algoritmizace
ZADÁNÍ Sestavte program, který vypočítá obvod a obsah čtverce o straně a. Zajistěte, aby výpočet byl realizován pouze v případě, kdy strana a bude mít.
Principy OOP Objektově orientované programování vychá-zí ze třech základních principů (rysů): zapouzdření (encapsulation) dědičnost (inheritance) polymorfismus.
Netrvaloppa21 Vytvořte třídu Student pro reprezentaci struktury student na ZČU. Atributy třídy budou fakulta a osobniCislo. Název třídy: Student proměnné.
POSLOUPNOST úkol 1_41. ZADÁNÍ Sestavte program, který doplní tabulku nepřímé úměrnosti pro hodnoty proměnné x = 1, …, n. Nepřímá úměrnost je zadána uživatelem.
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.
Pokročilé programování v C++ (část B)
Foreign key mapping Jakub Chalupa Naim Ashhab ČVUT FEL
PŘÍKAZ while úkol 1_42.
Service layer. Service layer – úvod Problém  Vytvoření API aplikace  Odstínění bussiness logiky a transakčního chování od zbytku aplikace  Kam s aplikační.
Prototyp. O čem to bude? Prototyp Účel  vytváření objektů  nový objekt se vytváří kopírováním (klonováním) vzoru – prototypu.
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í.
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ř.
Uživatelská rozhraní Cvičení 12a Martin Němec A
Uživatelská rozhraní Uživatelská rozhraní. knihovna Qt Trolltech (1994) v Oslu (Norsko) vytváří grafické uživatelské rozhraní (GUI) pro C++ multi-platformová.
Prototyp. O čem to bude? Prototyp Záměr  vytváření objektů  nový objekt se vytváří kopírováním (klonováním) vzoru – prototypu.
NÁZEV ŠKOLY: Střední odborná škola Net Office, spol. s r.o., Orlová-Lutyně AUTOR: Ing. Adéla Tomalová NÁZEV: Podpora výuky v technických oborech TEMA:
Proxy. Proxy poskytuje bariéru mezi klientem a reálnou implementací.
NÁZEV ŠKOLY: S0Š Net Office, spol. s r.o., Orlová-Lutyně AUTOR: Ing. Adéla Tomalová NÁZEV: Podpora výuky v technických oborech TEMA: Objektově orientované.
Memento. Motivace – kalkulačka 210° sin * /20 ? 0.25 ^2 ?
Testování aplikací v Javě Petr Adámek IBA CZ, s.r.o. © 2010.
Strategy. Motivace Ze života - jak to taky může vypadat (R): source("../algorithms/HOCForLOCF.R") source("../algorithms/HOCForLOCFv2.R") source("../MILP/MILP.R")
Y36PJC Programování v jazyce C/C++
Y36PJC Programování v jazyce C/C++
NÁZEV ŠKOLY: Střední odborná škola Net Office, spol. s r. o
Decorator Radek Zikmund NPRG024, LS 2016/17.
Návrhový vzor Flyweight
Abstract Factory.
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ří.
NÁZEV ŠKOLY: Střední odborná škola Net Office, spol. s r. o
Bridge.
ARP / RARP Václav Dědek.
C# přehled vlastností.
Přednášky z Distribuovaných systémů
Proxy 1.
Adapter
Composite “Spojuj a panuj”.
Bridge.
Transkript prezentace:

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

Struktura ÚČASTNÍCI  Subject společné rozhraní  RealSubject skutečný objekt  Proxy stejné rozhraní jako real subject má pointer na real subject, předává mu requesty, kontroluje přístup...

Motivace Kdy se hodí ?  Když je potřeba u klienta ošetřit práci se stavem cílového objektu (synchronizace, bezpečnost, objekt není vytvořen..)  Situaci ošetříme v proxy, klient pracuje s objektem aniž by věděl o jeho stavu ⇒ zjednodušení kódu Příklad  Prohlížeč obrázků seznam všech obrázků ve složce a jejich zobrazení špatné chování získá seznam obrázků a všechny fotky nahraje do paměti řešení – zobrazení fotky na vyžádání elegantní realizace řešení – PROXY

Prohlížeč obrázků class Image { public: virtual ~Image() { }; virtual void showImage() = 0; virtual Size getSize() = 0; }; class Image { public: virtual ~Image() { }; virtual void showImage() = 0; virtual Size getSize() = 0; }; class RealImage : public Image { public: RealImage( const std::string &fileName); ~RealImage() override { } void showImage() override; Size getSize() override; private: std::string fileName_; void loadImage(); Mat data_; }; class RealImage : public Image { public: RealImage( const std::string &fileName); ~RealImage() override { } void showImage() override; Size getSize() override; private: std::string fileName_; void loadImage(); Mat data_; }; class ImageProxy : public Image { public: ImageProxy(const std::string &fileName); ~ImageProxy() override { }; void showImage() override; Size getSize() override; private: std::string fileName_; Image* proxifiedImage_; }; class ImageProxy : public Image { public: ImageProxy(const std::string &fileName); ~ImageProxy() override { }; void showImage() override; Size getSize() override; private: std::string fileName_; Image* proxifiedImage_; }; Subject Proxy RealObject

Prohlížeč obrázků - implementace RealImage::RealImage( const std::string &fileName) : fileName_( fileName ) { // nacitani fotky z disku do pameti // vypocetne narocne pomale loadImage(); } void RealImage::showImage() { // skutecne renderovani obrazku } ImageProxy::ImageProxy( const std::string &fileName ) : fileName_(fileName) { } void ImageProxy::showImage() { // objekt je vytvořen až ve chvíli kdy je potřeba if ( proxifiedImage_ == nullptr ) { proxifiedImage_ = new RealImage(fileName_ ); } proxifiedImage_->showImage(); } RealImage::RealImage( const std::string &fileName) : fileName_( fileName ) { // nacitani fotky z disku do pameti // vypocetne narocne pomale loadImage(); } void RealImage::showImage() { // skutecne renderovani obrazku } ImageProxy::ImageProxy( const std::string &fileName ) : fileName_(fileName) { } void ImageProxy::showImage() { // objekt je vytvořen až ve chvíli kdy je potřeba if ( proxifiedImage_ == nullptr ) { proxifiedImage_ = new RealImage(fileName_ ); } proxifiedImage_->showImage(); } Image* imProxy1 = new ImageProxy( "img1.jpg" ); Image* imProxy2 = new ImageProxy( "img2.jpg" ); Image* imProxy3 = new ImageProxy( “img3.jpg" ); cout << imProxy3.getSize() << endl; imProxy1->showImage(); Image* imProxy1 = new ImageProxy( "img1.jpg" ); Image* imProxy2 = new ImageProxy( "img2.jpg" ); Image* imProxy3 = new ImageProxy( “img3.jpg" ); cout << imProxy3.getSize() << endl; imProxy1->showImage(); Size RealIMage::getSize() { // vrati informaci z nactenych dat return Size( data_.rows, data_.cols ) } Size ImageProxy::getSize() { // nacte si sirku a vysku z headeru obrazku // misto nacitani celeho obrazku return loadSizeFromHeader( fileName_ ); } Size RealIMage::getSize() { // vrati informaci z nactenych dat return Size( data_.rows, data_.cols ) } Size ImageProxy::getSize() { // nacte si sirku a vysku z headeru obrazku // misto nacitani celeho obrazku return loadSizeFromHeader( fileName_ ); }

Proxy - zoologie Virtual proxy  vytváření objektů až v případě potřeby („load on demand“)  transparentní provádění optimalizací (Cache proxy, Copy-on-write proxy) Remote proxy  lokální zástupce vzdáleného objektu  middleware: Java RMI, CORBA, XML/SOAP,... Protection proxy  kontrola či omezování přístupů ke skutečnému objektu Smart proxy  dodatečné operace při přístupu k objektu  Synchronization proxy synchronizace vláken před voláním metod objektu  Smart pointers/reference náhrada běžných ukazatelů (zejm. v C++) či referencí počítání referencí a automatické odalokování načítání do paměti při první dereferenci „protection proxy“

Proxy – implementace Abstraktní proxy pro subjekty více typů  pracuje-li se skutečným objektem jen pomocí rozhraní, může být typově nezávislá  konkrétní instanci lze přiřadit např. v konstruktoru: Přetížení „->“ v C++ jako proxy  stejná obsluha všech požadavků  Virtual proxy – ImagePtr, Real Subject – Image Implementace: Image* ImagePtr::LoadImage () { if (image_ == 0) image_ = LoadFile(_imageFile); return image_; } Image* ImagePtr::operator-> () { return LoadImage(); } Image& ImagePtr::operator* () { return *LoadImage(); } Použití: ImagePtr image = ImagePtr("ImgFileName"); image->Draw(Point(0, 0)); // (image.operator->())->Draw(Point(0, 0)) Graphic * g = new GraphicProtectionProxy(new Image);

Protection proxy - Java Řešení problému absence const v Javě:  omezená rozhraní  protection proxies (wrappers)‏ public interface java.util.Collection { boolean contains(Object o); boolean add(E o); //.... } public class UnmodifiableCollection implements Collection { private Collection c; public UnmodifiableCollection(Collection c) { this.c = c; } public boolean contains(Object o) { return c.contains(o); } public boolean add(E o) { throw new UnsupportedOperationException(); } //... } public static Collection unmodifiableCollection(Collection c) { return new UnmodifiableCollection (c); } // vytvoření seznamu List lst = new ArrayList(); // příprava dat apod. // nyní se vytvoří neměnná kolekce Collection c = Collections.unmodifiableCollection(lst);

Synchronization proxy - Java Standardní kolekce nejsou v Javě thread-safe  umožňuje to vyšší rychlost Volitelné řešení: synchronization proxies (wrappers)  myšlenkově identické s předchozí unmodifiableCollection public class SynchronizedCollection implements Collection { private Collection c; public SynchronizedCollection(Collection c) { this.c = c; } public boolean contains(Object o) { synchronized(this) {return c.contains(o);} } public boolean add(E o) { synchronized(this) {return c.add(o);} } //... } public static Collection synchronizedCollection(Collection c) { return new SynchronizedCollection (c); } // typický příklad - nepotřebujeme nesynchronizovanou instanci List l = Collections.synchronizedList(new LinkedList());

Proxy +/- Výhody  zjednodušení cílového kódu  zapouzdření optimalizací a strategie přistupování k objektu  oddělení administrativního kódu od funkcionality  transparentní NV Nevýhody  snižení efektivity kvuli vrstvě indirekce navíc  tvorba sady proxy pro větší subsystém může být zdlouhavá řešení: automatizace pomocí např. Reflection lepší řešení: vytvoření Fasády pro subsystém a jediné proxy (možno sloučit)  může generovat vlastní výjimky (remote proxy)  nebezpečí overkillu přes sofistikované strategie (cache proxy)

Proxy - související NV Adapter  též tvoří mezivrstvu  adaptuje jedno rozhraní na druhé odlišné proxy implementuje identické rozhraní jako skutečný objekt Decorator  podporuje dynamické i rekurzivní přiřazení skutečného objektu  podobná struktura, ale jiný účel - přidává funkčnost  musí po celou dobu běhu držet fyzickou instanci skutečného objektu u proxy ještě nemusí existovat či může být např. na jiném počítači Factory  sem lze zabalit rozhodnutí, jestli vyrobím skutečný objekt nebo proxy