Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
1
Proxy
2
Proxy poskytuje bariéru mezi klientem a reálnou implementací
3
Proxy – úvod 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ý přístup Cachování Load on demand Proxy Jednoduchý, ale efektivní vzor Spravuje použití a přístup ke zdrojům Šetří pamět, kontroluje přístup
4
Proxy – motivace Příklad ze života Proxy Šek nebo kreditní karta Použití Místo peněz Prostředek k přístupu k penězím Reální subjekt Bankovní účet Proxy kontroluje a spravuje přístup k objektu, který „ochraňuje“
5
Proxy – struktura UČASTNÍCI Subject Interface, ke kterému má klient přístup Proxy a RealSubject Implementují společné rozhraní Subject Client Není schopen přistupovat k RealSubject, aniž by prošel přes Proxy Proxy Má přístup k RealSubject Předává mu requesty, kontroluje přístup Zná některé jeho vlatnosti RealSubject Skutečný objekt
6
Proxy – použití Kdy ho použít Objekty leží v rozličných adresových prostorech Objekt je nutno vytvořit na dotaz Nutná kontrola přístupu k původnímu objektu Je vyžádána dodatečná funkcionalita při přístupu k objektu Lze také využít pro Oddělení kódu implementace od přístupu ke konkrétní knihovně Přístup k pamětově náročným položkám, jako obrázky nebo grafika Oddálení načítání zdrojů dokud nejsou potřeba Možnost zrychlení aplikace
7
Proxy – příklad použití Příklad Prohlížeč obrázků Seznam všech obrázků ve složce a jejich zobrazení Špatný přístup – získáme seznam obrázků a všechny fotky nahrajeme do paměti Lepší řešení – zobrazení fotky na vyžádání (load on demand) Elegantní realizace řešení – PROXY
8
Prohlížeč obrázků Interface Image { void showImage() ; Size getSize(); }; Interface Image { void showImage() ; Size getSize(); }; class RealImage implements Image { public RealImage(fileName) { // skutecne nacitani obrazku // pomale loadImage(fileName); } public void showImage() { // renderovani obrazku } public Size getSize(fileName) { return new Size(data.cols, data.rows); } }; class RealImage implements Image { public RealImage(fileName) { // skutecne nacitani obrazku // pomale loadImage(fileName); } public void showImage() { // renderovani obrazku } public Size getSize(fileName) { return new Size(data.cols, data.rows); } }; public class ImageProxy : Image { String fileName; Image proxifiedImage; public ImageProxy(String fileName){ this.fileName = fileName; } public void showImage() { if (proxifiedImage == null) proxifiedImage = new RealImage(fileName); proxifiedImage.showImage(); } public Size getSize() { return HdrInfo.loadSize(fileName); } }; public class ImageProxy : Image { String fileName; Image proxifiedImage; public ImageProxy(String fileName){ this.fileName = fileName; } public void showImage() { if (proxifiedImage == null) proxifiedImage = new RealImage(fileName); proxifiedImage.showImage(); } public Size getSize() { return HdrInfo.loadSize(fileName); } }; Interface Proxy RealObject ImageProxy img1 = new ImageProxy(“img1.png”); ImageProxy img2 = new ImageProxy(“img2.png”); Img1.showImage();//z disku Img1.showImage();//z paměti Img2.showImage();//z disku ImageProxy img1 = new ImageProxy(“img1.png”); ImageProxy img2 = new ImageProxy(“img2.png”); Img1.showImage();//z disku Img1.showImage();//z paměti Img2.showImage();//z disku
9
Proxy - typy 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 Synchronization proxy Synchronizace vláken před voláním metod objektu Smart pointers/reference Náhrada běžných ukazatelů (např. v C++) či referencí Počítání referencí a automatické odalokování Načítání do paměti při první dereferenci
10
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);
11
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 list = new ArrayList(); // příprava dat apod. // nyní se vytvoří neměnná kolekce Collection c = Collections.unmodifiableCollection(list);
12
Synchronization proxy - Java Standardní kolekce nejsou v Javě thread-safe Umožňuje vyšší rychlost Volitelné řešení: synchronization proxies (wrappers) Myšlenkově identické s předchozí unmodifiableCollection public class SynchronizedCollection implements Collection { private Collection c; private Object myLock; public SynchronizedCollection(Collection c) { this.c = c; } public boolean contains(Object o) { synchronized(myLock) {return c.contains(o);} } public boolean add(E o) { synchronized(myLock) {return c.add(o);} } //... } public static Collection synchronizedCollection(Collection c) { return new SynchronizedCollection (c); } // typický příklad List l = Collections.synchronizedList(new LinkedList());
13
Známé využití - Java RMI (Remote Method Invocation) public interface HelloIntf extends Remote { public String sayHello() throws RemoteException; } public class Hello extends UnicastRemoteObject implements HelloIntf { public Hello() throws RemoteException { } public String sayHello() throws RemoteException { return "Hello World!"; } public class Server { public static void main(String[] args) { try { Naming.rebind("Hello", new Hello()); } catch (Exception e) { } } public class Client { public static void main(String[] args) { try { HelloIntf hello =(HelloIntf)Naming.lookup("/localhost/Hello"); System.out.println(hello.sayHello()); } catch (Exception e) { } }
14
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í a snadný návrhový vzor Nevýhody Snižení efektivity vrstva navíc, reference navíc ne vždy to vadí (přístup k externím datům je mnohem pomalejší) Tvorba sady proxy pro větší subsystém může být zdlouhavá Řešení: automatizace pomocí např. Reflection – opět citelné zpomalení Klient o proxy vrstvě jakoby neví nezná možné vedlejší účinky (připojování k síti, náročné operace)
15
Proxy – související NV Adapter Také tvoří mezivrstvu Jiný účel Adapter: rozdílné rozhraní, stejná funkčnost Proxy: stejné rozhraní, rozdílná funkčnost Decorator 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
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.