Strukturalny wzorzec projektowy Proxy, jego zadaniem jest zbudowanie klasy, która zastępuje/emuluje zachowanie innego klasy/obiektu Jest to jeden z najprostszych wzorców projektowych, bardzo często niepozornie siedzący w kodzie.
Zastosowanie takiej kombinacji gdzie jeden obiekt zastępuje inny obiekt jest:
- Kontrola dostępu do ochranianego obiektu – np. dostęp do danych po autoryzacji użytkownika
- Opóźnienie tworzenia kosztownego obiektu, obiekt jest tworzony kiedy to jest niezbędne – tworzenie na żądanie
- Emulacja zdalnego obiektu, np.: dane obiektu przesyłane są przez internet
- Cachowanie pewnych danych obiektu – niektóre dane klasy długo się generują, albo są przeliczane wcześniej
- Dodatkowe operacje wykonywane przy dostępie do obiektu np.: zliczanie ilości referencji, czy tzw. Sprytne wskaźniki
Proxy jest w założeniu bardzo prostym wzorcem, ale umożliwia realizowanie dodatkowych zadań, które nie były przewidziane w interfejsie emulowanego obiektu.
Przykładowa implementacja, klasa dostarcza wygenerowane obrazy, przy pierwszym wywołaniu dostarczone są tylko grafiki poglądowe – generowanie właściwych wymaga bardzo dużo mocy obliczeniowej.
package pl.shad.net.blog;
/**
* Interfejs dostępu do danych
*/
interface ImageInterface{
String getImage();
}
/**
* Główna klasa generująca dane
*/
class Image implements ImageInterface{
@Override
public String getImage(){
return "HiRes image data ...";
}
}
/**
* Klasa proxy, przy pierwszym wywołaniu
* daje dane poglądowe
*/
class ProxyImage implements ImageInterface{
private Image image;
private int counter = 0;
@Override
public String getImage(){
counter++;
if (counter > 1){
if (image == null){
image = new Image();
}
return image.getImage();
}
return "LoRes proxy thumbnail ...";
}
}
/**
* Testowa klasa uruchomieniowa
*/
public class DesignPatternsProxy{
public static void main(String[] args){
//
// Odwołania do głównego obiektu bez użycia proxy
//
ImageInterface image = new Image();
System.out.println("Object without proxy:");
System.out.println("First access: " + image.getImage());
System.out.println("Second access: " + image.getImage());
//
// Odwołania do głównego obiektu z użyciem obiektu proxy
//
image = new ProxyImage();
System.out.println("Object with proxy:");
System.out.println("First access: " + image.getImage());
System.out.println("Second access: " + image.getImage());
}
}
Możliwość komentowania jest wyłączona.