Ce este
Șablonul Proxy pune un înlocuitor cu aceeași interfață în fața unui obiect real. Apelanții vorbesc cu înlocuitorul ca și cum ar fi obiectul adevărat; înlocuitorul decide când și cum implică originalul.
Sarcini obișnuite pentru un astfel de înlocuitor: memorarea răspunsurilor în cache, verificarea accesului, amânarea unei creări costisitoare, numărarea apelurilor.
Observație: numește clasa după sarcina ei — CachedWeather, ReadOnlyAccount — niciodată Proxy. Acel nume aparține deja unui obiect JavaScript încorporat.
Exemplu: un proxy cu cache
Serviciul meteo real este lent. Înlocuitorul răspunde la întrebările repetate din cache-ul său Map și apelează serviciul doar pentru cele noi — în spatele exact aceleiași interfețe Weather.
Înlocuitorul care ține minte
Prima întrebare despre Paris ajunge la serviciul la distanță; a doua primește răspuns din cache — linia (se apelează serviciul la distanță...) se afișează o singură dată, iar al doilea răspuns se termină cu (din cache).
Ieșire: program TypeScript și rezultatul capturat
interface Weather {
forecast(city: string): string
}
// Serviciul real este lent și costisitor.
class WeatherService implements Weather {
forecast(city: string): string {
console.log(" (se apelează serviciul la distanță...)")
return "însorit în " + city
}
}
// Înlocuitorul stă în fața serviciului și memorează răspunsurile.
class CachedWeather implements Weather {
private service: Weather
private cache = new Map<string, string>()
constructor(service: Weather) {
this.service = service
}
forecast(city: string): string {
const cached = this.cache.get(city)
if (cached !== undefined) {
return cached + " (din cache)"
}
const answer = this.service.forecast(city)
this.cache.set(city, answer)
return answer
}
}
const weather: Weather = new CachedWeather(new WeatherService())
console.log(weather.forecast("Paris"))
console.log(weather.forecast("Paris"))
Când să îl folosești
Folosește-l pentru a adăuga cache, control al accesului, încărcare amânată sau contorizare în fața a ceva ce nu poți sau nu ar trebui să modifici — în special resurse la distanță sau costisitoare.
Evită-l atunci când deții obiectul și comportamentul îi aparține lui. Un proxy servește la controlul accesului; un decorator servește la adăugarea de comportament în straturi — alege intenția care se potrivește.
Avantaje și dezavantaje
Avantaje: apelanții nu au nevoie de nicio modificare — păstrează aceeași interfață; 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 nevinovată.