Páginas

lunes, 2 de diciembre de 2013

Patrón Proxy: Ejemplo Realizar un control de acceso a recursos y/o partes del programa


Patrón Proxy

Ejemplo Realizar un control de acceso a recursos y/o partes del programa




El patrón Proxy se utiliza como intermediario para acceder a un objeto, permitiendo controlar el acceso a él. Para ello obliga que las llamadas a un objeto ocurran indirectamente a través de un objeto proxy, que actúa como un sustituto del objeto original, delegando luego las llamadas a los métodos de los objetos respectivos.

Este patrón se debe utilizar cuando:
  • Se necesite retrasar el coste de crear e inicializar un objeto hasta que es realmente necesario.
  • Se necesita una referencia a un objeto más flexible o sofisticada que un puntero.
Algunas situaciones comunes de aplicación son:
  • Proxy remoto: representa un objeto en otro espacio de direcciones. Esto quiere decir que el proxy será utilizado de manera tal que la conexión con el objeto remoto se realice de forma controlada sin saturar el servidor.
  • Proxy virtual: crea objetos costosos por encargo. Cuando se utiliza un software no siempre se cargan todas las opciones por default. Muchas veces se habilitan ciertos módulos sólo cuando el usuario decide utilizarlos.
  • Proxy de protección: controla el acceso a un objeto. Controla derechos de acceso diferentes.
  • Referencia inteligente: sustituto de un puntero que lleva a cabo operaciones adicionales cuando se accede a un objeto (ej. contar el número de referencias, cargar un objeto persistente en memoria, bloquear el objeto para impedir acceso concurrente, ...).
El patrón Proxy es muy versátil. Puede ser utilizado en infinitas ocasiones y se le puede otorgar varios usos. Tiene una gran ventaja y es que no obliga al desarrollador a crear demasiada estructura para realizar este patrón, sino que es una forma estándar de acceder a una clase que potencialmente puede ser conflictiva. Por otro lado, no ayuda al desarrollador a crear un algoritmo, sino que el desarrollador tiene que hacer toda la lógica.
Por estas razones, es un patrón donde no siempre se puede saber a priori cuando utilizarlo.
Esquema UML:

Subject: interfaz o clase abstracta que proporciona un acceso común al objeto real y su representante (proxy).
Proxy: mantiene una referencia al objeto real. Controla la creación y acceso a las operaciones del objeto real.
RealSubject: define el objeto real representado por el Proxy.
Cliente: solicita el servicio a través del Proxy y es éste quién se comunica con el RealSubject.


Esquema de Proxy usado para control de acceso a un recurso


Ejemplo: Control De Acceso A Recursos/Partes del Propgrama
Para enseñar como  se  usaría este patrón para realizar un control de acceso a distintos recursos, y ademas llevar un contador de cuantos intentos de accesos se han realizado y cuantos han accedido. (lo usaremos como  Proxy de protección  y Referencia inteligente )
 Tenemos 3 tipos de usuarios y dos departamentos (recursos), que tienen su acceso permitido segun este cuadro:

Esquema de interacción entre clases:



Este sería el proyeto en Gambas3:

Recursos:
Clase Irecurso:
->

Clase RecursoAlmacen:
->

Clase RecursoContabilidad:
->

Control mediante Proxy de los Recursos:
Clase RecursoProxy:
->

En esta clase, he definido la variable "hnivel" para el recurso, que con su valor se comprobará si puede acceder o no el usuario.


Clase RecursoAlmacenProxy:
->

Clase RecursoContabilidadProxy:
->

Clase Usuario:
->

Los usuarios, tienen una propiedad "nivelAcceso" que les  indica cual será su  nivel de acceso.
Es muy sencillo, gestionar el acceso a los usuarios a los distintos recursos, simplemente cambiando el valor de esta propiedad.


Programa Principal:
->



Ejecutando la aplicación en el IDE de Gambas3:

Podéis ver, como en la consola se va mostrando información de los intentos accesos de los usuarios .
 Estos datos se pueden guardar fácilmente en un archivo, no lo he querido añadir, para simplificar al máximo el ejemplo.


Enlace de descarga del ejemplo: enlace box

Fuentes:
http://arantxa.ii.uam.es/~eguerra/docencia/0809/12%20Proxy.pdf
http://migranitodejava.blogspot.com.es/search/label/Proxy