Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
ZveřejnilVlasta Kučerová
1
Proxy
2
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
3
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...
4
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
5
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
6
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_ ); }
7
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“
8
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);
9
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);
10
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());
11
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)
12
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
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.