1. ¿Qué es el Patrón Proxy
El patrón proxy es un patrón de diseño estructural que actúa como un intermediario para controlar el acceso a un objeto específico. Basado en el objeto objetivo (el objeto que está siendo proxificado), el patrón proxy proporciona un objeto proxy a través del cual los clientes pueden acceder al objeto objetivo, permitiendo agregar funcionalidad adicional al objeto objetivo.
1.1 Definición del Patrón Proxy
El patrón proxy es un patrón de diseño que implica la colaboración de dos o más objetos. Uno de los objetos es el objeto objetivo real que se llama, mientras que uno o más objetos actúan como objetos proxy. Los objetos proxy interceptan el acceso al objeto objetivo, proporcionando una forma indirecta de acceder al mismo.
1.2 Propósito y Objetivos del Patrón Proxy
El propósito principal del patrón proxy es proporcionar una forma indirecta de acceder al objeto objetivo, permitiendo agregar funcionalidad adicional al mismo. Los objetos proxy pueden manejar lógica común, como controlar el acceso al objeto objetivo, almacenar en caché y registrar. El patrón proxy también puede implementar la carga diferida, instanciando el objeto objetivo solo cuando sea necesario.
2. Características y Ventajas del Patrón Proxy
El patrón proxy tiene las siguientes características y ventajas:
- Puede extender la funcionalidad del objeto objetivo sin modificarlo.
- Puede controlar el acceso al objeto objetivo a través del objeto proxy.
- Puede realizar operaciones adicionales antes o después de acceder al objeto objetivo.
- Puede implementar la carga diferida, instanciando el objeto objetivo solo cuando sea necesario.
3. Ejemplos de Aplicaciones Prácticas del Patrón Proxy
El patrón proxy se usa ampliamente en muchos escenarios de aplicación. Aquí hay algunos ejemplos comunes de aplicaciones prácticas:
- Proxy Remoto: Se utiliza para acceder a objetos en la red de forma local.
- Proxy Virtual: Se utiliza para crear objetos costosos según sea necesario.
- Proxy de Seguridad: Se utiliza para controlar el acceso a objetos.
- Referencia Inteligente: Se utiliza para realizar operaciones adicionales al acceder a objetos, como el conteo de objetos.
4.1 Diagrama de Clases UML
El siguiente es el diagrama de clases UML del Patrón Proxy en Golang:
4.2 Introducción del Ejemplo
Supongamos que tenemos una interfaz Subject
que define un método Request
. Tenemos una clase de implementación concreta RealSubject
, que implementa la interfaz Subject
. Luego creamos una clase proxy Proxy
, que contiene un objeto RealSubject
y también implementa la interfaz Subject
. En el método Request
de la clase Proxy
, podemos realizar operaciones adicionales antes o después de llamar al método Request
de RealSubject
.
4.3 Paso 1 de Implementación: Definir la Interfaz Proxy
Primero, necesitamos definir una interfaz Subject
que contenga un método Request
:
package main
type Subject interface {
Request()
}
4.4 Paso 2 de Implementación: Implementar el Objeto Objetivo
A continuación, implementamos el objeto específico objetivo RealSubject
, que implementa la interfaz Subject
:
package main
import "fmt"
type RealSubject struct {}
func (r *RealSubject) Request() {
fmt.Println("RealSubject: Manejando la Petición")
}
4.5 Paso 3 de Implementación: Implementar el Objeto Proxy
A continuación, creamos un objeto proxy, Proxy
, que contiene un objeto RealSubject
e implementa la interfaz Subject
. En el método Request
del proxy, podemos realizar algunas operaciones adicionales antes o después de llamar al método Request
de RealSubject
:
package main
import "fmt"
type Proxy struct {
realSubject *RealSubject
}
func (p *Proxy) Request() {
fmt.Println("Proxy: Pre-Solicitud")
if p.realSubject == nil {
p.realSubject = &RealSubject{}
}
p.realSubject.Request()
fmt.Println("Proxy: Post-Solicitud")
}
4.6 Paso 4 de Implementación: Invocar el Objeto Proxy
Finalmente, podemos usar el objeto proxy, Proxy
, para invocar los métodos del objeto proxificado, RealSubject
:
package main
func main() {
proxy := Proxy{}
proxy.Request()
}
Ejecutar el código anterior producirá la salida:
Proxy: Pre-Solicitud
RealSubject: Manejando la Petición
Proxy: Post-Solicitud
5.1 Diferencia y Conexión entre el Patrón de Proxy y el Patrón Decorator
Tanto el patrón de proxy como el patrón decorator son patrones de diseño estructurales, ambos contienen un objeto objetivo y un objeto proxy/decorator. Sin embargo, existen algunas diferencias entre los dos:
- El patrón de proxy generalmente implica control de acceso al objeto objetivo, mientras que el patrón decorator se centra más en la extensión del objeto objetivo.
- El patrón de proxy normalmente realiza operaciones adicionales antes o después del objeto objetivo, mientras que el patrón decorator agrega dinámicamente funcionalidad extra sobre el objeto objetivo.
5.2 Comparación entre el Proxy Estático y el Proxy Dinámico
El patrón de proxy se puede dividir en proxy estático y proxy dinámico. El proxy estático determina el tipo del objeto proxy en tiempo de compilación, y el objeto proxy es escrito manualmente por el programador. Por otro lado, el proxy dinámico genera dinámicamente el objeto proxy en tiempo de ejecución en base a la interfaz del objeto objetivo. El proxy dinámico es más flexible pero también más complejo en comparación con su contraparte estática.
5.3 Aplicación del Patrón de Proxy en Microservicios
El patrón de proxy se puede aplicar en una arquitectura de microservicios. Por ejemplo, podemos utilizar un proxy para encapsular el acceso a otros microservicios e implementar mecanismos como balanceo de carga, limitación de tasas y cortes de circuitos en la capa de proxy. Esto puede mejorar la fiabilidad y el rendimiento del sistema. El patrón de proxy también puede ser utilizado para implementar la funcionalidad de descubrimiento de servicios y enrutamiento.