Wednesday, November 21, 2012

Proxy Pattern



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: