Wzorzec projektowy pełnomocnik - proxy

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 3496 razy

Opis wzorca projektowego pełnomocnik

Wzorzec projektowy pełnomocnik należy do wzorców strukturalnych. Jego celem jest utworzenie obiektu, który kontroluje inny obiekt. Wzorzec ten może być wykorzystany np. do inicjacji zawartego wewnątrz obiektu dopiero w momencie próby wykonania na nim jakiejś operacji. Przyczyną takiego stanu rzeczy może być fakt, że obiekt nie zawsze będzie potrzebny a jego utworzenie jest czasochłonne.

Przykład diagramu UML dla wzorca projektowego pełnomocnik

Na poniższym diagramie UML można zobaczyć interfejs iImage oraz dziedziczące po nim klasy ImageProxy (będąca pełnomocnikiem) i Image (agregowana przez pełnomocnika). W tej implementacji klasa Image dysponuje statycznym konstruktorem createImage, który sprawdza, czy plik graficzny istnieje a następnie zwraca wskaźnik na nowo utworzony obiekt tejże klasy. Jeżeli plik nie istnieje zwracany będzie NULL.

Klasa ImageProxy tworzy obiekt klasy Image dopiero, gdy będzie wywołana po raz pierwszy metoda draw.

Przykład diagramu UML dla wzorca projektowego pełnomocnik
Rys. 1
Przykład diagramu UML dla wzorca projektowego pełnomocnik

Przykładowa implementacja wzorca projektowego pełnomocnik w C++

#include <iostream> #include <string> #include <fstream> class iImage{ public: virtual void draw() = 0; virtual ~iImage(){}; }; class Image : public iImage{ public: Image(){ std::cout<<"Create ImageProxy!!!"<<std::endl<<std::endl; } static Image* createImage(std::string path){ std::ifstream imageFile(path.c_str()); if(imageFile.good()){ return new Image; }else{ return NULL; } } virtual void draw() { std::cout << "Draw hight resolution image" << std::endl << std::endl; } virtual ~Image(){ std::cout << "Image object destroyed" << std::endl << std::endl; } }; class ImageProxy : public iImage{ iImage* image; std::string imagePath; public: inline ImageProxy(std::string imagePath) : image(NULL), imagePath(imagePath){ std::cout<<"Create ImageProxy object!!!" << std::endl << std::endl; }; virtual void draw() { if(image == NULL){ std::cout<<"Inicjalize Image object!!!"<<std::endl<<std::endl; image = Image::createImage(imagePath); } if(image){ image->draw(); }else{ std::cout << "Some error, file not exists" << std::endl << std::endl; } } virtual ~ImageProxy(){ std::cout << "Delete ImageProxy!!!" << std::endl << std::endl; if(image){ delete image; image = NULL; } std::cout << "End of delete ImageProxy!!!" << std::endl << std::endl; } }; int main(){ iImage* image = new ImageProxy("admin.jpg"); image->draw(); if(image){ delete image; image = NULL; } std::cin.get(); return 0; }

Wynik działania powyższego kodu:

Create ImageProxy object!!!

Inicjalize Image object!!!

Create ImageProxy!!!

Draw hight resolution image

Delete ImageProxy!!!

Image object destroyed

End of delete ImageProxy!!!

Strony powiązane
strony powiązane
  1. sourcemaking.com/design_patterns/proxy - strona opisująca wzorzec projektowy pełnomocnik [En]
  2. pl.wikipedia.org - opis tego wzorca na stronie Wikipedii
Propozycje książek