Padrão de Projeto Proxy

O padrão de design Proxy é um dos padrões de design estruturais e, na minha opinião, um dos padrões mais simples de entender.

Padrão de Design Proxy

A intenção do padrão de design Proxy, de acordo com o GoF, é: Fornecer um substituto ou espaço reservado para outro objeto para controlar o acesso a ele. A definição em si é muito clara e o padrão de design Proxy é usado quando queremos fornecer acesso controlado a uma funcionalidade. Vamos supor que temos uma classe que pode executar algum comando no sistema. Agora, se estamos usando essa classe, tudo bem, mas se quisermos fornecer esse programa para um aplicativo de cliente, pode haver sérios problemas porque o programa do cliente pode emitir comandos para excluir alguns arquivos do sistema ou alterar algumas configurações que não desejamos. Aqui, uma classe proxy pode ser criada para fornecer acesso controlado ao programa.

Padrão de Design Proxy – Classe Principal

Como codificamos em Java em termos de interfaces, aqui está nossa interface e a classe de implementação dela. 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 {
                //alguma implementação pesada
		Runtime.getRuntime().exec(cmd);
		System.out.println("'" + cmd + "' command executed.");
	}

}

Padrão de Projeto Proxy – Classe Proxy

Agora queremos fornecer apenas aos usuários administradores acesso total à classe acima; se o usuário não for administrador, apenas comandos limitados serão permitidos. Aqui está nossa implementação muito simples da 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);
			}
		}
	}

}

Programa Cliente do Padrão de Projeto 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());
		}
		
	}

}

A saída do exemplo de programa acima do padrão de projeto proxy é:

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

Usos comuns do padrão de projeto proxy incluem controle de acesso ou fornecimento de uma implementação de invólucro para melhor desempenho. O pacote Java RMI usa o padrão proxy. Isso é tudo para o padrão de projeto proxy em Java.

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