Proxy jest strukturalnym wzorcem projektowym wykorzystywanym do reprezentowania skomplikowanego obiektu lub obiektu, którego utworzenie wymaga dużego nakładu czasu, za pomocą obiektu prostego. Jeżeli tworzenie obiektu jest czasochłonne lub zasobożerne, Proxy pozwala odłożyć akt tworzenia tego obiektu na czas, w którym ten obiekt rzeczywiście będzie potrzebny. Proxy ma taki sam interfejs jak obiekt którego reprezentuje ( a tak właściwie to nie muszą implementować tego samego interfejsy – wymagane jest tylko aby proxy posiadało definicje wszystkich metod obiektu docelowego). Kiedy pełny obiekt zostanie stworzony, Proxy przekazuje do niego wszystkie wywołania metod.

Proxy stosuje się:

  • kiedy obiekt potrzebuje dużo czasu na załadowanie,
  • kiedy obiekt znajduje się na odległej maszynie i ładowanie go przez sieć może być długotrwałe,
  • kiedy chcemy aby prawa dostępu do obiektu były ograniczone – proxy sprawdza uprawnienia użytkownika, przed załadowaniem odpowiedniego obiektu.

Bardzo często wzorzec proxy wykorzystuje się wraz z mechanizmami RMI.
Rodzaje proxy:

  • Copy-On-Write Proxy – odracza kopiowanie obiektu docelowego do momentu kiedy jest potrzebny klientowi,
  • Protection Proxy – różnym klientom dostarcza różny poziom dostępu do obiektu docelowego,
  • Cache Proxy – w tymczasowej pamięci przechowuje wyniki kosztownych operacji obiektu docelowego, po to by klienci mogli je dzielić,
  • Firewall Proxy – chroni obiekt docelowy przed niepowołowanymi klientami,
  • Smart Reference Proxy – dostarcza dodatkowe operacje w momencie odwołania do obiektu docelowego, jak np. liczba odwołań do obiektu docelowego.

    public interface ProxyBase {
    public void metoda();
    }

    public class Implementacja implements ProxyBase{
    public void metoda() {
    System.out.println(„Wykonuję metodę: metoda”);
    }
    }

    public class Proxy implements ProxyBase {
    private Implementacja implementacja;

    }

.