Modello di Progettazione Proxy

Il design pattern Proxy è uno dei design pattern strutturali e, secondo me, è uno dei pattern più semplici da comprendere.

Design Pattern Proxy

L’intento del design pattern Proxy secondo GoF è: Fornire un surrogato o un placeholder per un altro oggetto per controllare l’accesso ad esso. La definizione stessa è molto chiara e il design pattern Proxy viene utilizzato quando desideriamo fornire un accesso controllato a una funzionalità. Supponiamo di avere una classe che può eseguire alcuni comandi sul sistema. Se la stiamo utilizzando direttamente, va bene, ma se vogliamo fornire questo programma a un’applicazione client, potrebbero verificarsi gravi problemi perché il programma client potrebbe emettere comandi per eliminare alcuni file di sistema o modificare alcune impostazioni che non vogliamo. In questo caso, è possibile creare una classe proxy per fornire un accesso controllato al programma.

Design Pattern Proxy – Classe principale

Dato che codifichiamo in Java in termini di interfacce, ecco la nostra interfaccia e la relativa implementazione. CommandExecutor.java

package com.journaldev.design.proxy;

public interface CommandExecutor {

	public void runCommand(String cmd) throws Exception;
}

CommandExecutorImpl.java

package com.journaldev.design.proxy;

import java.io.IOException;

public class CommandExecutorImpl implements CommandExecutor {

	@Override
	public void runCommand(String cmd) throws IOException {
                //alcune implementazioni pesanti
		Runtime.getRuntime().exec(cmd);
		System.out.println("'" + cmd + "' command executed.");
	}

}

Modello di Progettazione Proxy – Classe Proxy

Ora vogliamo permettere solo agli utenti amministratori di avere pieno accesso alla classe sopra, se l’utente non è un amministratore, saranno consentiti solo comandi limitati. Ecco la nostra implementazione molto semplice della classe proxy. CommandExecutorProxy.java

package com.journaldev.design.proxy;

public class CommandExecutorProxy implements CommandExecutor {

	private boolean isAdmin;
	private CommandExecutor executor;
	
	public CommandExecutorProxy(String user, String pwd){
		if("Pankaj".equals(user) && "J@urnalD$v".equals(pwd)) isAdmin=true;
		executor = new CommandExecutorImpl();
	}
	
	@Override
	public void runCommand(String cmd) throws Exception {
		if(isAdmin){
			executor.runCommand(cmd);
		}else{
			if(cmd.trim().startsWith("rm")){
				throw new Exception("rm command is not allowed for non-admin users.");
			}else{
				executor.runCommand(cmd);
			}
		}
	}

}

Programma Client del Modello di Progettazione Proxy

ProxyPatternTest.java

package com.journaldev.design.test;

import com.journaldev.design.proxy.CommandExecutor;
import com.journaldev.design.proxy.CommandExecutorProxy;

public class ProxyPatternTest {

	public static void main(String[] args){
		CommandExecutor executor = new CommandExecutorProxy("Pankaj", "wrong_pwd");
		try {
			executor.runCommand("ls -ltr");
			executor.runCommand(" rm -rf abc.pdf");
		} catch (Exception e) {
			System.out.println("Exception Message::"+e.getMessage());
		}
		
	}

}

L’output del programma di esempio del modello di progettazione proxy è:

'ls -ltr' command executed.
Exception Message::rm command is not allowed for non-admin users.

Gli usi comuni del modello di progettazione proxy sono il controllo dell’accesso o la fornitura di un’implementazione wrapper per una migliore performance. Il pacchetto Java RMI utilizza il modello di progettazione proxy. Questo è tutto per il modello di progettazione proxy in Java.

Source:
https://www.digitalocean.com/community/tutorials/proxy-design-pattern