Proxy¶
Przeznaczenie
- Zapewnia substytut lub reprezentanta innego obiektu w celu sterowania dostępem do niego 
Kontekst
- Tworzenie obiektów i ich inicjalizacja w trakcie działania programu jest kosztowne 
- Potrzebna jest kontrola dostępu do obiektu 
Problem
- Optymalizacja kosztownych procesów lub kontrola dostępu powinna być przezroczysta dla klienta 
Scenariusz¶
Chcemy napisać edytor dokumentów, który umożliwia osadzanie obiektów graficznych:
- otwieranie dokumentów powinno być szybkie 
- optymalizacja nie powinna mieć wpływu na części programu związane z wyświetlaniem czy formatowaniem 
Rozwiązanie:
- użycie innego obiektu, pełnomocnika rysunku, który zastąpi prawdziwy rysunek 
- pełnomocnik zachowuje się jak rysunek i zajmuje się jego utworzeniem, gdy jest to konieczne 
- ..image:: images/uml-schemes/Proxy_Image.*
- width
- 500px 
- align
- center 
 
- ..image:: images/uml-schemes/Proxy_Image_Sekwencja.*
- width
- 400px 
- align
- center 
 
Rodzaje obiektów Proxy¶
Proxy ma zastosowanie zawsze wtedy, gdy potrzeba bardziej uniwersalnego lub bardziej wyrafinowanego odwołania do obiektu.
Rodzaje obiektów Proxy:
- Remote proxy – jest lokalnym reprezentantem obiektu znajdującego się w innej przestrzeni adresowej (stub – namiastka; .NET Remoting). 
- Virtual proxy – tworzy kosztowne obiekty na żądanie. 
- Protection proxy – kontroluje dostęp do oryginalnego obiektu. 
- Smart prox – modyfikuje żądanie przed przesłaniem go do oryginalnego obiektu. 
Struktura¶
 
Uczestnicy¶
Proxy
- przechowuje odwołanie, które umożliwia mu dostęp do prawdziwego przedmiotu 
- zapewnia taki sam interfejs jak interfejs przedmiotu (Subject) 
- obiekt Proxy może być zastąpiony obiektem typu Subject 
- kontroluje dostęp do prawdziwego przedmiotu i może być odpowiedzialny za tworzenie przedmiotu oraz usuwanie 
Subject – klasa definiująca wspólny interfejs dla prawdziwego przedmiotu (RealSubject) i pełnomocnika (Proxy)
RealSubject – definiuje rzeczywisty przedmiot reprezentowany przez pełnomocnika
Współpraca¶
Obiekt pełnomocnika (proxy), jeśli trzeba, przekazuje żądania do prawdziwego obiektu (realSubject) (w zależności od rodzaju pełnomocnika).
 
Konsekwencje¶
- Wzorzec Proxy wprowadza dodatkowy poziom pośredniości przy dostępie do obiektu. 
- Remote Proxy – może ukryć fakt, że obiekt znajduje się w innej przestrzeni adresowej/ 
- Virtual Proxy – może wykonywać optymalizacje, np. tworzenie obiektu na żądanie, kopiowanie-przy-zapisaniu. 
- Protection Proxy i Smart Proxy – umożliwiają wykonywanie dodatkowych czynności porządkowych przy dostępie do obiektu. 
Implementacja¶
Proxy różnią się między sobą tym, jak bardzo ich implementacja jest podobna do implementacji dekoratorów:
- Protection Proxy – może być zaimplementowany dokładnie tak samo jak dekorator 
- Remote Proxy – nie zawiera bezpośredniego odwołania do swojego prawdziwego przedmiotu, a jedynie pośrednie (identyfikator hosta i lokalny adres na nim) 
Wzorce pokrewne¶
- Adapter – zapewnia inny interfejs do adaptowanego obiektu. Proxy zapewnia taki sam interfejs, jak interfejs przedmiotu. 
- Decorator – pomimo podobnej implementacji, przeznaczenie wzorca Proxy jest inne. Decorator dodaje zobowiązania do obiektu, a Proxy steruje dostępem do obiektu. 
Podsumowanie¶
- Zapewnia obiekt pośrednika, dzięki któremu możemy optymalizować wywołanie kosztownych operacji lub kontrolować dostęp do oryginału. 
- Interfejs obiektu Proxy jest taki sam jak interfejs oryginału.