Padrão de Design Proxy

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

Padrão de Design Proxy

O objetivo 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 é utilizado quando desejamos fornecer acesso controlado a uma funcionalidade. Digamos que tenhamos uma classe que pode executar algum comando no sistema. Se estivermos usando-a, tudo bem, mas se quisermos fornecer esse programa a uma aplicação cliente, pode haver problemas graves, porque o programa 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 sua classe de implementação. 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 de 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 do programa acima do padrão de projeto de proxy é:

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

Os usos comuns do padrão de projeto de proxy são controlar o acesso ou fornecer uma implementação de wrapper para melhor desempenho. O pacote Java RMI usa o padrão de proxy. Isso é tudo para o padrão de projeto de proxy em java.

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