Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Proxy. Proxy poskytuje bariéru mezi klientem a reálnou implementací.

Podobné prezentace


Prezentace na téma: "Proxy. Proxy poskytuje bariéru mezi klientem a reálnou implementací."— Transkript prezentace:

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


Stáhnout ppt "Proxy. Proxy poskytuje bariéru mezi klientem a reálnou implementací."

Podobné prezentace


Reklamy Google