Patrones de diseño estructurales: Proxy

Intención del patrón

  • Proporcionar un sustituto o placeholder para otro objeto para controlar el acceso a él.
  • Utilizar un nivel extra de indirección para soportar un acceso distribuido, controlado o inteligente.
  • Agregar un wrapper y delegación para proteger el componente real de la complejidad excesiva.

Ejemplo de problema

Se necesita soportar objetos que están ávidos de recursos. A su vez, se requiere que dichos objetos no se instancien a menos que sean requeridos a su vez por un cliente.

Discusión

Diseñar un objeto sustituto, o Proxy, que: cree una instancia del objeto real la primera vez que el cliente solicite de un Proxy, recuerde la identidad del objeto real y redirija la solicitud hacia el objeto real.
Existen cuatro situaciones comunes en las cuales el patrón Proxy es aplicable.
  1. Un Proxy virtual es un placeholder para crear objetos "caros". El objeto real es creado solamente cuando un cliente solicita/accede al objeto por primera vez.
  2. Un Proxy remoto proporciona una representación local para un objeto que reside en un espacio de memoria diferente. Esto es lo que el stub de código en el RPC y CORBA se ofrece.
  3. Un Proxy protector controla el acceso a un objeto maestro "sensible". El objeto sustituto verifica que quien llama tiene el permiso de acceso requerido antes de redirigir la solicitud.
  4. Un Proxy inteligente interpone acciones adicionales cuando un objeto es accedido. Los usos típicos incluyen:
  • Conteo del número de referencias al objeto real para que pueda ser liberado automáticamente cuando no haya más referencias (alias Proxy Pointer).
  • Cargado un objeto en memoria cuando es referenciado por primera vez.
  • Verificar que el objeto real está bloqueado antes de accederlo para asegurarse que ningún otro objeto pueda cambiarlo.

Estructura

Al definir una interfaz Subject, la presencia del objeto Proxy ubicado en lugar del RealSubject es transparente para el cliente.


Ejemplo

El patrón Proxy proporciona un sustituto o placeholder para proporcionar acceso a un objeto. Un cheque o un giro bancario es un Proxy para los fondos en una cuenta. Un cheque puede reemplazar al efectivo al realizar compras y, finalmente, controla el acceso al dinero en la cuenta del emisor.


Check list

  1. Identificar la influencia o "aspecto" que es mejor implementado como un wrapper o sustituto.
  2. Definir una interfaz que haga que el proxy y el componente original sean intercambiables.
  3. Considerar definir un Factory que pueda encapsular la decisión de si un objeto real o un proxy es deseable.
  4. La clase wrapper contiene un puntero a la clase real e implementa la interfaz.
  5. El puede ser inicializado en la construcción o al usarlo por primera vez.
  6. Cada método wrapper contribuye su influencia y delegados en el objeto real.

Reglas de oro

  • Adapter proporciona una interfaz diferente a su sujeto.Proxy proporciona la misma interfaz. Decorator proporciona una interfaz mejorada.
  • Decorator y Proxy tienen diferentes propósitos pero estructuras similares. Ambos describen como proporcionar un nivel de indirección a un objeto y las implementaciones mantienen una referencia al objeto que ellos redirigen las solicitudes.

Ejemplo de código en 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();
  }  
}

0 comentarios:

Publicar un comentario

Muchas gracias por leer el post y comentarlo.

 
Copyright 2009 Programación SOLIDa
BloggerTheme by BloggerThemes | Design by 9thsphere