Il pattern Proxy viene utilizzato quando si vuol rappresenta la funzionalità di una classe tramite un’altra. Questo tipo di design pattern rientra tra quelli Strutturali.

proxy

Nella fattispecie, un oggetto contiene l’oggetto originale e ne interfaccia le funzionalità con il mondo esterno.

DIAGRAMMA UML PROXY

uml

IMPLEMENTAZIONE

Creiamo l’interfaccia Immagine e le relative classi concrete che la implementano. ImmagineProxy è una classe utilizzata per ridurre la memoria da caricamento di oggetti ImmagineReale. La classe Main utilizzerà la classe Proxy per caricare un oggetto ed utilizzarlo.

Step 1: Creiamo l’interfaccia Immagine

public interface Immagine {
    void mostra();
}

Step 2: Creiamo le classi concrete che la implementano

ImmagineReale.java

public class ImmagineReale implements Immagine {

    private String nomeFile;

    public ImmagineReale(String nomeFile){
        this.nomeFile = nomeFile;
        caricaImmagine(nomeFile);
    }

    @Override
    public void mostra() {
        System.out.println("[IMMAGINEREALE]: mostra(): " + nomeFile);
    }

    private void caricaImmagine(String nomeFile){
        System.out.println("[IMMAGINEREALE]: caricaImmagine(): " + nomeFile);
    }
}

ImmagineProxy.java

public class ImmagineProxy implements Immagine{

    private ImmagineReale immagineReale;
    private String nomeFile;

    public ImmagineProxy(String nomeFile){
        this.nomeFile = nomeFile;
    }

    @Override
    public void mostra() {
        System.out.println("[IMMAGINEPROXY]: mostra()::start");
        if(immagineReale == null){
            System.out.println("[IMMAGINEPROXY]: mostra()::immagine null");
            immagineReale = new ImmagineReale(nomeFile);
        }
        immagineReale.mostra();
        System.out.println("[IMMAGINEPROXY]: mostra()::end");
    }
}

Step 3: Utilizziamo la classe del pattern tramite il Main

public class Main {
    public static void main(String[] args) {
        Immagine immagine = new ImmagineProxy("IMG_001.jpg");

        immagine.mostra();
        System.out.println("");
        immagine.mostra();
    }
}

Step 4: Output

[IMMAGINEPROXY]: mostra()::start
[IMMAGINEPROXY]: mostra()::immagine null
[IMMAGINEREALE]: caricaImmagine(): IMG_001.jpg
[IMMAGINEREALE]: mostra(): IMG_001.jpg
[IMMAGINEPROXY]: mostra()::end

[IMMAGINEPROXY]: mostra()::start
[IMMAGINEREALE]: mostra(): IMG_001.jpg
[IMMAGINEPROXY]: mostra()::end

LINK UTILI