Utilisateur
Fornire un surrogato o un segnaposto per un altro oggetto per controllare l'accesso ad esso.
Per rinviare la creazione di oggetti costosi fino a quando non sono necessari.
Ad esempio, in un editor di documenti, un'immagine costosa (come un'immagine raster) viene creata solo quando è visibile, migliorando così la velocità di apertura del documento.
Quando si desidera un riferimento più sofisticato ad un oggetto, rispetto a un semplice puntatore.
Quando è necessario gestire oggetti costosi che devono essere creati su richiesta (proxy virtuale).
Quando si vuole proteggere l'accesso a un oggetto (proxy di protezione).
Quando si ha bisogno di riferimenti intelligenti per eseguire azioni aggiuntive come il conteggio dei riferimenti o il caricamento in memoria di oggetti persistenti.
Proxy (ImageProxy): Controlla l'accesso al soggetto reale, fornendo un'interfaccia identica al soggetto reale e gestendo la sua creazione su richiesta.
Subject (Graphic): Definisce l'interfaccia comune per il RealSubject e il Proxy.
RealSubject (Image): L'oggetto reale che il Proxy rappresenta.
Il Proxy inoltra le richieste al RealSubject quando appropriato.
A seconda del tipo di Proxy (virtuale, remoto, di protezione), può gestire la creazione, l'accesso o la protezione del soggetto reale.
Vantaggi:
Introduce un livello di indirezione, permettendo di posticipare la creazione di oggetti costosi (ad esempio, immagine su richiesta).
Consente la gestione dell'accesso a oggetti reali tramite protezione, ottimizzazione o gestione dei riferimenti.
Svantaggi:
Aggiunge una complessità nella gestione dell'accesso e nella creazione degli oggetti.
Può introdurre latenza a causa dell'indirezione.
Sovraccarico dell'operatore di accesso: In C++, l'operatore -> può essere sovraccaricato per consentire al Proxy di comportarsi come un puntatore e aggiungere logica aggiuntiva.
Gestione uniforme dei soggetti: Il Proxy può gestire tutti i RealSubject tramite un'interfaccia astratta, ma deve conoscere la classe concreta se deve istanziare i soggetti (come nel caso di un Proxy virtuale).
Indipendenza dal tipo di oggetto: Il Proxy può gestire oggetti di tipo diverso con un'interfaccia comune senza dover conoscere il tipo specifico del RealSubject.
In molte applicazioni
Adapter: Modifica l'interfaccia di un oggetto per renderla compatibile con un'altra interfaccia.
Decorator: Aggiunge funzionalità a un oggetto esistente in modo flessibile e dinamico.