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