Proxy
Propósito
Según el libro "Patrones de Diseño" [29] el patrón Proxy "proporciona un representante o sustituto de otro objeto para controlar el acceso a este".
También conocido como
Surrogate (Sustituto)
Estructura

Participantes
Proxy:
mantiene una referencia que permite al proxy acceder a la variable original. El proxy puede referirse a un Sujeto en caso de que las interfaces de SujetoReal y Sujeto sean la misma.
proporciona una interfaz idéntica a la de Sujeto, de manera que un proxy pueda ser sustituido por el sujeto real.
controla el acceso al sujeto real, y puede ser responsable de su creación y borrado.
otras responsabilidades dependen del tipo de proxy:
los proxies remotos son responsables de codificar una petición y sus argumentos para enviar la petición codificada al sujeto real que se encuentra en un espacio de direcciones diferente.
los proxies virtuales pueden guardar información adicional sobre el sujeto real, por lo que pueden retardar el acceso al mismo.
los proxies de protección comprueban que el llamador tenga los permisos de acceso necesarios para realizar una petición.
Sujeto:
define una interfaz común para el SujetoReal y el Proxy, de modo que pueda usarse un Proxy en cualquier sitio en el que se espere un SujetoReal.
SujetoReal:
define la variable real representada.
Implementación
No se observan impedimentos y/o modificaciones de la estructura original del patrón para su implementación en Go.
Código de ejemplo
En este ejemplo queremos restringir los accesos a redes sociales en los navegadores de una escuela. Para esto realizaremos un proxy de protección.
Implementación:
// Sujeto Interface
type NavegadorInterface interface {
Direccion(string) string
}
// Sujeto Real
type Navegador struct{}
func (n *Navegador) Direccion(url string) string {
return "Respuesta de la url " + url
}
// Proxy
type NavegadorProxy struct {
navegador NavegadorInterface
}
func (n *NavegadorProxy) Direccion(url string) string {
if url == "http://twitter.com" || url == "http://facebook.com" {
return "Acceso restringido a " + url
}
return n.navegador.Direccion(url)
}
Se puede probar la implementación del patrón de la siguiente forma:
navegadorProxy := &NavegadorProxy{&Navegador{}}
fmt.Printf("%s\n", navegadorProxy.Direccion("http://google.com"))
fmt.Printf("%s\n", navegadorProxy.Direccion("http://twitter.com"))
fmt.Printf("%s\n", navegadorProxy.Direccion("http://facebook.com"))
Código de ejemplo | Ejecutar código
Atención: Esta publicación se encuentra abandonada. Puede acceder a la versión vigente en https://leanpub.com/designpatternsingo
Última actualización
¿Te fue útil?