“Fornecer um substituto ou marcador da localização de outro objeto para controlar o acesso a esse objeto.”
Proxy é um padrão de design estrutural que permite fornecer um substituto ou espaço reservado para outro objeto controlar o acesso a ele.
- Estrutura Básica:
- Exemplo Acesso ao Banco de Dados:
-
Imagine que você tem um objeto poderoso que adora consumir grandes quantidades de recursos do sistema. Você precisa disso de tempos em tempos, mas nem sempre.
Assim, o objeto provavelmente poderia ser criado não no início do programa, mas sim quando é realmente necessário. Cada cliente desse objeto precisaria ter algum tipo de código de inicialização adiada. Obviamente, isso leva a muita duplicação.
-
O padrão Proxy sugere a criação de uma classe substituta que tenha a mesma interface que um objeto de serviço original. Ao receber a solicitação de um cliente, o objeto proxy cria uma instância de um objeto de serviço e delega todo o trabalho real.
-
Mas qual é o benefício? Você poderia colocar algum código em um objeto proxy que seria executado logo antes (ou depois) de chamar o mesmo método em um objeto de serviço real. E graças à mesma interface que o proxy compartilha com o objeto de serviço, ele pode ser passado para qualquer código que aceite objetos de serviço.
- Controla o acesso a objetos sem que os clientes percebam.
- Funciona mesmo quando o objeto de serviço não está pronto.
- Gerencia o ciclo de vida de um objeto de serviço, mesmo quando os clientes não se importam.
- Atraso na resposta quando chamado o serviço.
⛔ - Inicialização lenta (proxy virtual - Lazy Initiation). Quando você tem um objeto pesado que carrega dados de um sistema de arquivos, rede ou banco de dados.
✔️ - Em vez de carregar dados no início do aplicativo, pode-se atrasar a inicialização do objeto para um momento em que é necessário.
⛔ - Controle de acesso (proxy de proteção). Quando um programa tem diferentes tipos de usuários e você deseja proteger um objeto contra o uso não autorizado. Por exemplo, quando os objetos são partes cruciais de um sistema operacional e os programas (incluindo os maliciosos) são seus clientes.
✔️ - O proxy pode verificar as credenciais do cliente em cada solicitação e passar a solicitação para o objeto de serviço somente se o acesso for concedido.
⛔ - Execução local de um serviço remoto (proxy remoto). Quando um objeto de serviço real está localizado em um servidor remoto.
✔️ - Neste caso, o proxy passa a solicitação do cliente para um objeto de serviço remoto pela rede, manipulando todos os detalhes da transferência de rede.
⛔ - Objetos de armazenamento em cache (referência "inteligente" - smart reference). Quando você precisa armazenar em cache os resultados das solicitações do cliente e gerenciar seu ciclo de vida (quando os resultados são pesados).
✔️ - O proxy pode contar o número de referência para um objeto de serviço ou resultados armazenados em cache. Quando todas as referências forem liberadas, o proxy poderá destruir o objeto que rastreia (por exemplo, encerrar a conexão com o banco de dados).
O proxy também pode controlar se o cliente alterou o objeto de serviço. Permite reutilizar o objeto inalterado e salva os recursos do sistema.
⛔ - Solicitação de log (proxy de log - logging proxy). Quando você precisa manter um histórico de solicitações para um objeto de serviço.
✔️ - O proxy pode registrar cada solicitação antes de transmiti-la a um objeto de serviço.