Ce este
Șablonul Proxy pune un înlocuitor cu aceeași interfață în fața unui obiect real. Apelanții vorbesc cu proxy-ul ca și cum ar fi obiectul adevărat; proxy-ul decide când și cum implică originalul.
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 meteo real 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 la distanță; a doua primește răspuns din cache — linia „se apelează serviciul la distanță” se afișează o singură dată.
Ieșire: program Go și rezultatul capturat
package main
import "fmt"
type Weather interface {
Forecast(city string) string
}
// Serviciul real este lent și costisitor.
type WeatherService struct{}
func (WeatherService) Forecast(city string) string {
fmt.Println(" (se apelează serviciul la distanță...)")
return "însorit în " + city
}
// Proxy-ul stă în față și păstrează răspunsurile în cache.
type CachedWeather struct {
service WeatherService
cache map[string]string
}
func (c *CachedWeather) Forecast(city string) string {
if answer, ok := c.cache[city]; ok {
return answer + " (din cache)"
}
answer := c.service.Forecast(city)
c.cache[city] = answer
return answer
}
func main() {
w := &CachedWeather{cache: map[string]string{}}
fmt.Println(w.Forecast("Paris"))
fmt.Println(w.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ă schimbi — mai ales resurse aflate la distanță sau costisitoare.
Renunță la el când obiectul îți aparține și comportamentul îi revine chiar 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 nevinovată.