O padrão de proxy em Java

O padrão de proxy em Java

1. Visão geral

The Proxy pattern allows us to create an intermediary that acts as an interface to another resource, ao mesmo tempo em que oculta a complexidade subjacente do componente.

2. Exemplo de padrão de proxy

Considere um objeto Java pesado (como uma conexão JDBC ouSessionFactory) que requer alguma configuração inicial.

Queremos apenas que esses objetos sejam inicializados sob demanda e, uma vez que o sejam, queremos reutilizá-los para todas as chamadas:

image

Vamos agora criar uma interface simples e a configuração para este objeto:

public interface ExpensiveObject {
    void process();
}

E a implementação desta interface com uma grande configuração inicial:

public class ExpensiveObjectImpl implements ExpensiveObject {

    public ExpensiveObjectImpl() {
        heavyInitialConfiguration();
    }

    @Override
    public void process() {
        LOG.info("processing complete.");
    }

    private void heavyInitialConfiguration() {
        LOG.info("Loading initial configuration...");
    }

}

Agora vamos utilizar o padrão Proxy e inicializar nosso objeto sob demanda:

public class ExpensiveObjectProxy implements ExpensiveObject {
    private static ExpensiveObject object;

    @Override
    public void process() {
        if (object == null) {
            object = new ExpensiveObjectImpl();
        }
        object.process();
    }
}

Sempre que nosso cliente chamar o métodoprocess(), eles apenas conseguirão ver o processamento e a configuração inicial sempre permanecerá oculta:

public static void main(String[] args) {
    ExpensiveObject object = new ExpensiveObjectProxy();
    object.process();
    object.process();
}

Observe que estamos chamando o métodoprocess() duas vezes. Nos bastidores, a parte de configurações ocorrerá apenas uma vez - quando o objeto for inicializado pela primeira vez.

Para todas as outras chamadas subseqüentes, esse padrão ignorará a configuração inicial e apenas o processamento ocorrerá:

Loading initial configuration...
processing complete.
processing complete.

3. Quando usar proxy

Understanding how para usar um padrão é importante.

Understanding when para usá-lo é crítico.

Vamos falar sobre quando usar o padrão Proxy:

  • When we want a simplified version of a complex or heavy object. Neste caso, podemos representá-lo com um objeto esqueleto que carrega o objeto original sob demanda, também chamado de inicialização lenta. Isso é conhecido como Proxy Virtual

  • When the original object is present in different address space, and we want to represent it locally. Podemos criar um proxy que faça todo o material necessário, como criar e manter a conexão, codificação, decodificação etc., enquanto o cliente o acessa como estava presente em seu espaço de endereço local. Isso é chamado de proxy remoto

  • When we want to add a layer of security to the original underlying object to provide controlled access based on access rights of the client. Isso é chamado de Proxy de proteção

4. Conclusão

Neste artigo, vimos o padrão de design do proxy. Essa é uma boa escolha nos seguintes casos:

  • Quando queremos ter uma versão simplificada de um objeto ou acessar o objeto com mais segurança

  • Quando queremos uma versão local de um objeto remoto

O código-fonte completo para este exemplo está disponívelover on GitHub.