Il modello proxy in Java

1. Panoramica

Il modello Proxy ci consente di creare un intermediario che funge da interfaccia per un'altra risorsa , nascondendo anche la complessità sottostante del componente.

2. Esempio di modello proxy

Considera un oggetto Java pesante (come una connessione JDBC o una SessionFactory ) che richiede una configurazione iniziale.

Vogliamo che tali oggetti vengano inizializzati solo su richiesta e, una volta che lo sono, vorremmo riutilizzarli per tutte le chiamate:

Creiamo ora una semplice interfaccia e la configurazione per questo oggetto:

public interface ExpensiveObject { void process(); }

E l'implementazione di questa interfaccia con un'ampia configurazione iniziale:

public class ExpensiveObjectImpl implements ExpensiveObject { public ExpensiveObjectImpl() { heavyInitialConfiguration(); } @Override public void process() { LOG.info("processing complete."); } private void heavyInitialConfiguration() { LOG.info("Loading initial configuration..."); } }

Ora utilizzeremo il modello Proxy e inizializzeremo il nostro oggetto su richiesta:

public class ExpensiveObjectProxy implements ExpensiveObject { private static ExpensiveObject object; @Override public void process() { if (object == null) { object = new ExpensiveObjectImpl(); } object.process(); } }

Ogni volta che il nostro client chiama il metodo process () , vedrà solo l'elaborazione e la configurazione iniziale rimarrà sempre nascosta:

public static void main(String[] args) { ExpensiveObject object = new ExpensiveObjectProxy(); object.process(); object.process(); }

Nota che stiamo chiamando il metodo process () due volte. Dietro le quinte, la parte delle impostazioni avverrà solo una volta, quando l'oggetto viene inizializzato per la prima volta.

Per ogni altra chiamata successiva, questo modello salterà la configurazione iniziale e verrà eseguita solo l'elaborazione:

Loading initial configuration... processing complete. processing complete.

3. Quando utilizzare il proxy

Capire come usare un pattern è importante.

Capire quando usarlo è fondamentale.

Parliamo di quando utilizzare il pattern Proxy:

  • Quando vogliamo una versione semplificata di un oggetto complesso o pesante. In questo caso, possiamo rappresentarlo con un oggetto scheletro che carica l'oggetto originale su richiesta, chiamato anche inizializzazione pigra. Questo è noto come proxy virtuale
  • Quando l'oggetto originale è presente in uno spazio di indirizzi diverso e vogliamo rappresentarlo localmente . Possiamo creare un proxy che fa tutte le cose fondamentali necessarie come creare e mantenere la connessione, codificare, decodificare, ecc., Mentre il client vi accede come era presente nel loro spazio di indirizzi locale. Questo è chiamato Remote Proxy
  • Quando vogliamo aggiungere un livello di sicurezza all'oggetto sottostante originale per fornire un accesso controllato in base ai diritti di accesso del client . Questo si chiama Proxy di protezione

4. Conclusione

In questo articolo, abbiamo esaminato il modello di progettazione del proxy. Questa è una buona scelta nei seguenti casi:

  • Quando vogliamo avere una versione semplificata di un oggetto o accedere all'oggetto in modo più sicuro
  • Quando vogliamo una versione locale di un oggetto remoto

Il codice sorgente completo per questo esempio è disponibile su GitHub.