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 ale unui proxy: păstrarea răspunsurilor în cache, verificarea accesului, amânarea unei creări costisitoare, numărarea apelurilor.
Exemplu: un proxy cu cache
Serviciul real de meteo este lent. Proxy-ul răspunde la întrebările repetate din cache-ul său și apelează serviciul doar pentru cele noi — în spatele exact aceleiași interfețe.
Înlocuitorul care ține minte
Prima întrebare despre Paris ajunge la serviciul remote; a doua primește răspuns din cache — linia „apelarea serviciului remote” se afișează o singură dată. O singură verificare isset pe tabloul de cache decide pe ce cale merge o întrebare.
Ieșire: script PHP
<?php
interface Weather {
public function forecast(string $city): string;
}
// Serviciul real este lent și costisitor.
class WeatherService implements Weather {
public function forecast(string $city): string {
echo " (apelarea serviciului remote...)\n";
return "însorit în " . $city;
}
}
// Proxy-ul stă în față și păstrează răspunsurile în cache.
class CachedWeather implements Weather {
/** @var array<string, string> */
private array $cache = [];
public function __construct(private WeatherService $service) {}
public function forecast(string $city): string {
if (isset($this->cache[$city])) {
return $this->cache[$city] . " (din cache)";
}
$answer = $this->service->forecast($city);
$this->cache[$city] = $answer;
return $answer;
}
}
$w = new CachedWeather(new WeatherService());
echo $w->forecast("Paris"), "\n";
echo $w->forecast("Paris"), "\n";
Când să îl folosești
Folosește-l pentru a adăuga cache, control al accesului, evaluare leneșă sau contorizare în fața a ceva ce nu poți sau nu ar trebui să modifici — mai ales resurse remote sau costisitoare.
Renunță la el când obiectul îți aparține și comportamentul ține de interiorul lui. Un proxy controlează accesul; un decorator adaugă comportament în straturi — alege intenția care se potrivește.
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 care pare inofensivă.