Proxy Pattern
Esta semana comecei a trabalhar em um projeto que implementa o padrão Proxy para acesso aos serviços expostos pelo domínio. Segue abaixo os detalhes deste padrão que é realmente muito útil, principalmente em sistemas que apresentam arquitetura orientada a serviços.
Descrição do pattern:
"O Pattern Proxy é um pattern Estrutural definido pelo 'Gang of Four'. O seu objetivo principal é encapsular um objeto através de um outro objeto que possui a mesma interface, de forma que o segundo objeto, conhecido como “Proxy”, controla o acesso ao primeiro, que é o objeto real."
Objetivos principais do pattern:
· Fornecer um placeholder para acesso controlado a um determinado objeto
· Usar uma camada extra que permite um acesso inteligente, controlado e distribuído aos recursos do sistema.
· Usar um wrapper e delegate para encapsular o componente real que está sendo acessado.
Tipos de Proxy:
· Virtual Proxy: Placeholder para objetos cuja construção é complexa. Geralmente, o objeto real só é criado na primeira vez que o cliente faz a requisição.
· Remote Proxy: Permite acesso a um representante local de um objeto que reside em um outro espaço de endereçamento.
· Protective Proxy: Permite acesso a um objeto assim como o Remote proxy, ou o virtual porém ele confere se o cliente que fez a requisição tem as devidas permissões para acessar o recurso.
· Smart Proxy: Contém regra de negócios adicionais para controle de acesso ao recurso.
Exemplo Simples de Implementação:
Suponha a arquitetura abaixo, aonde temos aplicações front end que dependem dos serviços espostos pelo domínio.
Imagine que por algum motivo os serviços precisam ser alterados. Caso a arquitetura acima esteja implementada, será necessário atualizar a dependência entre cada um dos projetos front ends com cada um dos serviços acessados.
Quando implementamos o padrão Proxy, nossa estrutura muda para algo parecido com a figura abaixo (retirando as interfaces implementadas pelo serviço):
Usando este padrão, todas as camadas de front-end vão depender do proxy, no caso de precisarmos atualizar as dependências, apenas o proxy será alterado, como cada uma das aplicações faz referência a este proxy elas serão atualizadas indiretamente.
Principais vantagens do pattern:
· Permite deixar transparente o local (endereço) do objeto real. O cliente não precisa conhecer se o objeto é remoto ou não, este tipo de proxy é conhecido como Remote Proxy.
· Útil para realizar otimizações, como cache de objetos, rotinas de logs e controle de acesso (segurança). Este tipo de proxy é conhecido como Virtual Proxy.
Exemplo Simples de código C#:
using System;
// MainApp test application
class MainApp
{
static void Main()
{
// Create proxy and request a service
Proxy proxy = new Proxy();
proxy.Request();
// Wait for user
Console.Read();
}
}
// "Subject"
abstract class Subject
{
public abstract void Request();
}
// "RealSubject"
class RealSubject : Subject
{
public override void Request()
{
Console.WriteLine("Called RealSubject.Request()");
}
}
// "Proxy"
class Proxy : Subject
{
RealSubject realSubject;
public override void Request()
{
// Use 'lazy initialization'
if (realSubject == null)
{
realSubject = new RealSubject();
}
realSubject.Request();
}
}
Good Stuff:


