Patrones de Diseño: Proxy
El patrón Proxy
El patrón Proxy esta clasificado dentro de los Patrones Estructurales, es también conocido como, Embajador, Apoderado (surrogante). Veamos primero su definición:
Un proxy fuerza a que un método de un objeto RealSubject sea indirectamente ejecutado a través de un objeto Proxy, el cual actúa como delegado o sustituto del objeto RealSubject. Los objetos Proxy son usualmente declarados sin que el Cliente sepa de que se trata de un Objeto Proxy.
Les dejo un diagrama de clases de cómo se implementa este patrón.
Usos del patrón Proxy
- Control de Acceso: El patrón puede ser usado para controlar el acceso a los métodos del RealSubject. La lógica del control de acceso se delegará en el proxy, de esta forma quedará mas limpio el RealSubject (en términos de código).
- Acceso a objetos remotos: Representación de un objeto remoto de forma local, es decir, el Proxy resuelve y enmascara la forma en cómo conectarse al objeto remoto. Ejemplos de implementación de este patrón los pueden encontrar en EJB y RMI.
- Proxy Virtual: Crea objetos costosos bajo demanda. Por ejemplo, al iniciar una aplicación se pueden instanciar con este patrón todos los iconos de dicha aplicación, pero sólo cuando éste sea solicitado realmente ira a buscarlo al disco y presentado al usuario.
- Proxy de Referencia Inteligente: Sustituto de una referencia que hace operaciones adicionales cuando se accede a un objeto, como por ejemplo, controlar concurrencia, contar numero de instancias, cargar un objeto en memoria, manejo de cache)
Implementación de Ejemplo
Partamos con la interfaz que deben cumplir tanto RealSubject como el SubjectProxy
1 | public interface Subject { |
Veamos la implementación del RealSubject
1 | public class SubjectReal implements Subject { |
Finalmente la implementación del SubjectProxy
1 | public class SubjectProxy implements Subject { |
Nuestro cliente (quien consumirá a Subject) será un test unitario:
1 | public class SubjectTest { |
Esto imprimirá lo siguiente en la consola (systemOut)
1 | Access Denied |
La explicación al Access Denied esta dada porque el patrón Proxy se utilizó como control de acceso al método doOperation. Sólo si el username es admin se ejecutará dicho método.
Veamos un Segundo Test Unitario
1 | public class SubjectTest { |
Esta es la salida:
1 | doOperacion proxied |
En este caso, el usuario admin puede ejecutar la operación y la primera vez que lo haga se conectará un objeto remoto o difícil de crear (simulado para el ejemplo). Luego una vez conectado, podrá ejecutar la operación.
Nuevamente el usuario admin ejecutará la operación por segunda vez y el SubjectProxy ya posee una conexión al objeto remoto, aquí simplemente ejecutará la operación.
Espero les haya gustado y les sirva en sus proyectos, en el siguiente post les comentaré sobre Dynamic Proxy de Java.
Referencias:
Nota: Busquen el error en wikipedia español si lo encuentra me lo comenta ;)
Patrones de Diseño: Proxy
https://blog.pcollaog.cl/2013/07/06/patrones-de-diseno-proxy-pattern/