Proxy-mønsteret i Java

1. Oversigt

Proxy-mønsteret giver os mulighed for at oprette en mellemmand, der fungerer som en grænseflade til en anden ressource, samtidig med at den skjuler komponentens underliggende kompleksitet.

2. Proxy-mønstereksempel

Overvej et tungt Java-objekt (som en JDBC-forbindelse eller en SessionFactory) der kræver nogle indledende konfigurationer.

Vi ønsker kun, at sådanne genstande initialiseres efter behov, og når de er det, vil vi genbruge dem til alle opkald:

Lad os nu oprette en simpel grænseflade og konfigurationen til dette objekt:

offentlig grænseflade ExpensiveObject {ugyldig proces (); }

Og implementeringen af ​​denne grænseflade med en stor indledende konfiguration:

offentlig klasse ExpensiveObjectImpl implementerer ExpensiveObject {public ExpensiveObjectImpl () {heavyInitialConfiguration (); } @ Overstyr offentlig ugyldig proces () {LOG.info ("behandling afsluttet."); } privat ugyldigt heavyInitialConfiguration () {LOG.info ("Indlæser oprindelig konfiguration ..."); }}

Vi bruger nu proxymønsteret og initialiserer vores objekt efter behov:

offentlig klasse ExpensiveObjectProxy implementerer ExpensiveObject {privat statisk ExpensiveObject-objekt; @ Overstyr offentlig ugyldig proces () {if (object == null) {object = new ExpensiveObjectImpl (); } objekt.proces (); }}

Når vores klient ringer til behandle() metode, vil de bare se behandlingen og den oprindelige konfiguration forbliver altid skjult:

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

Bemærk, at vi ringer til behandle() metode to gange. Bag kulisserne forekommer indstillingsdelen kun én gang - når objektet først initialiseres.

For hvert andet efterfølgende opkald springer dette mønster over den indledende konfiguration, og kun behandling finder sted:

Indlæser den oprindelige konfiguration ... behandlingen er afsluttet. behandlingen er afsluttet.

3. Hvornår skal man bruge proxy

Forstå hvordan at bruge et mønster er vigtigt.

Forståelse hvornår at bruge det er kritisk.

Lad os tale om, hvornår vi skal bruge proxymønsteret:

  • Når vi ønsker en forenklet version af en kompleks eller tung genstand. I dette tilfælde kan vi repræsentere det med et skeletobjekt, der indlæser det originale objekt efter behov, også kaldet doven initialisering. Dette er kendt som den virtuelle proxy
  • Når det originale objekt er til stede i forskellige adresserum, og vi vil repræsentere det lokalt. Vi kan oprette en proxy, der gør alle de nødvendige kedelpladegrejer som at oprette og vedligeholde forbindelsen, kodning, afkodning osv., Mens klienten får adgang til den, som den var til stede i deres lokale adresseområde. Dette kaldes Remote Proxy
  • Når vi vil tilføje et lag af sikkerhed til det oprindelige underliggende objekt for at give kontrolleret adgang baseret på klientens adgangsrettigheder. Dette kaldes Protection Proxy

4. Konklusion

I denne artikel kiggede vi på proxy-designmønsteret. Dette er et godt valg i følgende tilfælde:

  • Når vi vil have en forenklet version af et objekt eller få adgang til objektet mere sikkert
  • Når vi ønsker en lokal version af et fjernobjekt

Den fulde kildekode til dette eksempel er tilgængelig på GitHub.