Patrón de Diseño Proxy

El patrón de diseño Proxy es uno de los patrones de diseño estructurales y, en mi opinión, uno de los patrones más simples de entender.

Patrón de Diseño Proxy

La intención del patrón de diseño Proxy según GoF es: Proporcionar un sustituto o marcador de posición para otro objeto para controlar el acceso a él. La definición en sí misma es muy clara y el patrón de diseño Proxy se utiliza cuando queremos proporcionar un acceso controlado a una funcionalidad. Supongamos que tenemos una clase que puede ejecutar algún comando en el sistema. Si la estamos utilizando, está bien, pero si queremos darle este programa a una aplicación cliente, puede tener problemas graves porque el programa cliente puede emitir comandos para eliminar algunos archivos del sistema o cambiar algunas configuraciones que no deseamos. Aquí se puede crear una clase proxy para proporcionar un acceso controlado al programa.

Patrón de Diseño Proxy – Clase Principal

Dado que codificamos en Java en términos de interfaces, aquí está nuestra interfaz y su clase de implementación. 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 {
                // alguna implementación pesada
		Runtime.getRuntime().exec(cmd);
		System.out.println("'" + cmd + "' command executed.");
	}

}

Patrón de Diseño Proxy – Clase Proxy

Ahora queremos proporcionar acceso completo solo a los usuarios administradores a la clase anterior; si el usuario no es administrador, solo se permitirán comandos limitados. Aquí está nuestra implementación muy simple de la clase 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);
			}
		}
	}

}

Programa Cliente del Patrón de Diseño 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());
		}
		
	}

}

La salida del programa de ejemplo anterior del patrón de diseño proxy es:

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

Los usos comunes del patrón de diseño proxy son controlar el acceso o proporcionar una implementación de envoltura para un mejor rendimiento. El paquete Java RMI utiliza el patrón de diseño proxy. Eso es todo para el patrón de diseño proxy en Java.

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