Ce este
Șablonul Proxy pune în fața unui obiect real un înlocuitor cu aceeași interfață. Apelanții vorbesc cu proxy-ul ca și cum ar fi obiectul real; proxy-ul decide când și cum îl implică pe cel original.
Sarcini obișnuite pentru un proxy: memorarea răspunsurilor în cache, verificarea accesului, amânarea creării costisitoare, numărarea apelurilor.
Exemplu: un proxy cu cache
Serviciul meteo real este lent. Proxy-ul răspunde la întrebările repetate din cache-ul său și apelează serviciul doar pentru cele noi — ambele clase respectă exact același protocol Weather, așa că apelanții nu le pot deosebi.
Înlocuitorul care ține minte
Prima întrebare despre Paris ajunge la serviciul la distanță; a doua primește răspuns din cache — linia „apelăm serviciul la distanță” se afișează o singură dată.
Ieșire: program Python complet
from typing import Protocol
class Weather(Protocol):
def forecast(self, city: str) -> str: ...
# Serviciul real este lent și costisitor.
class WeatherService:
def forecast(self, city: str) -> str:
print(" (apelăm serviciul la distanță...)")
return "însorit în " + city
# Proxy-ul stă în față și memorează răspunsurile în cache.
class CachedWeather:
def __init__(self) -> None:
self.service = WeatherService()
self.cache: dict[str, str] = {}
def forecast(self, city: str) -> str:
cached = self.cache.get(city)
if cached is not None:
return cached + " (din cache)"
answer = self.service.forecast(city)
self.cache[city] = answer
return answer
w = CachedWeather()
print(w.forecast("Paris"))
print(w.forecast("Paris"))
Când să-l folosești
Folosește-l pentru a adăuga cache, control al accesului, inițializare întârziată sau contorizare în fața a ceva ce nu poți sau nu ar trebui să modifici — mai ales resurse la distanță sau costisitoare.
Renunță la el când obiectul îți aparține și comportamentul își are locul în interiorul lui. Un proxy servește la controlul accesului; un decorator servește la adăugarea de comportament în straturi — alege intenția potrivită.
Avantaje și dezavantaje
Avantaje: apelanții nu au nevoie de nicio modificare; munca costisitoare este evitată sau controlată într-un singur loc.
Dezavantaje: comportament ascuns — un apelant poate primi un răspuns din cache fără să știe; cache-urile învechite și refuzurile neașteptate se depanează în spatele unei interfețe cu aspect inofensiv.