Design Patterns — Parte 14 — Proxy
Intenção
Proxy é um padrão de design estrutural que permite fornecer um substituto ou espaço reservado para outro objeto. Um proxy controla o acesso ao objeto original, permitindo que você execute algo antes ou depois que a solicitação chega ao objeto original.
Problema
Você precisa oferecer suporte a objetos com fome de recursos e não deseja instanciar esses objetos, a menos e até que eles sejam realmente solicitados pelo cliente.
Solução
O padrão Proxy sugere que você crie uma nova classe de proxy com a mesma interface que um objeto de serviço original. Em seguida, você atualiza seu aplicativo para que ele transmita o objeto proxy para todos os clientes do objeto original. Ao receber uma solicitação de um cliente, o proxy cria um objeto de serviço real e delega todo o trabalho para ele.
O proxy se disfarça de objeto de banco de dados. Ele pode lidar com inicialização lenta e cache de resultados sem o cliente ou o objeto de banco de dados real saiba.
Mas qual é o benefício? Se você precisar executar algo antes ou depois da lógica primária da classe, o proxy permitirá fazer isso sem alterar essa classe. Como o proxy implementa a mesma interface que a classe original, ele pode ser passado para qualquer cliente que espera um objeto de serviço real.
Implementação
O diagrama de classes UML para a implementação do padrão de design do proxy é fornecido abaixo:
As classes, interfaces e objetos no diagrama de classes UML acima são os seguintes:
Subject
Essa é uma interface com membros que serão implementados pelas classes RealSubject e Proxy.
RealSubject
Esta é uma classe que queremos usar com mais eficiência usando a classe proxy.
Proxy
Esta é uma classe que contém a instância da classe RealSubject e pode acessar os membros da classe RealSubject, conforme necessário.
Prós
- Você pode controlar o objeto de serviço sem que os clientes saibam disso.
- Você pode gerenciar o ciclo de vida do objeto de serviço quando os clientes não se importam com isso.
- O proxy funciona mesmo se o objeto de serviço não estiver pronto ou não estiver disponível.
- Princípio Aberto / Fechado . Você pode introduzir novos proxies sem alterar o serviço ou os clientes.
Contras
- O código pode se tornar mais complicado, pois você precisa introduzir muitas novas classes.
- A resposta do serviço pode demorar.
Exemplo
Uso do padrão em C#
Quem é o que
As classes, interfaces e objetos no diagrama de classes acima podem ser identificados da seguinte maneira:
IClient- interface Subject.
RealClient — classe RealSubject.
ProxyClient — classe Proxy.
Diagrama de classes
Exemplo prático
Bom vamos lá, vou tentar dar um exemplo simples e direto. Vou começar criando a interface IClient que será nosso subject e ela irá conter o seguinte código:
public interface IClient
{
string GetData();
}
Em seguida irei adicionar classe RealSubject que irá implementar IClient, e ela irá conter o seguinte código:
public class RealClient : IClient
{
string Data;
public RealClient()
{
Console.WriteLine("Real Client: Initialized");
Data = "XP Inc. Medium";
}
public string GetData()
{
return Data;
}
}
Em seguida iremos criar nosso proxy, e a classe irá conter o seguinte código:
public class ProxyClient : IClient
{
RealClient client = new RealClient();
public ProxyClient()
{
Console.WriteLine("ProxyClient: Initialized");
}
public string GetData()
{
return client.GetData();
}
}
E por último vamos modificar no Program.cs, e ele ficará com o seguinte código:
class Program
{
static void Main(string[] args)
{
var proxy = new ProxyClient();
Console.WriteLine($"Data from Proxy Client = {proxy.GetData()}");Console.WriteLine("Press any key to close!");
Console.ReadKey();
}
}
Bom pessoal, em todos os posts estou tentando simplificar os exemplos, vou ficando por aqui, não deixe de acompanhar a postagem da semana que vem irei falar do próximo pattern da lista.
Não esqueça que os exemplos estão no Github. Abraço, até mais pessoal.