Bridge

Propósito

Según el libro "Patrones de Diseño" [29] el patrón Bridge "desacopla una abstracción de su implementación, de modo que ambas puedan variar de forma independiente".

También conocido como

Handle/Body (Manejador/Cuerpo)

Estructura

Participantes

  • Abstraccion:

    • define la interfaz de la abstracción.

    • mantiene una referencia a una variable de tipo Implementador.

  • AbstraccionRefinada:

    • extiende la interfaz definida por Abstraccion.

  • Implementador:

    • define la interfaz de los tipos de datos de implementación. Esta interfaz no tiene por qué corresponderse exactamente con la de Abstracción; de hecho, ambas interfaces pueden ser muy distintas. Normalmente la interfaz Implementador solo proporciona operaciones primitivas, y Abstraccion define operaciones de más alto nivel basadas en dichas primitivas.

  • ImplementadorConcreto:

    • implementa la interfaz Implementador y define su implementación concreta.

Implementación

  • No se observan impedimentos para su implementación en Go.

  • En este caso, dado que Abstraccion se define como una interface pero a la vez también implementando comportamiento concreto para mantener la referencia del tipo de dato Implementador, se separará en dos partes en dos partes: a) por un lado los comportamientos abstractos deben definirse en una interface Abstraccion Interface, y b) por otro lado los comportamientos concretos (el que mantiene una referencia del Implementador) dentro de un tipo de dato Abstraccion Abstracta.

  • Las Abstracciones Refinadas se componen (en vez de heredar) de Abstraccion Abstracta.

Código de ejemplo

En este ejemplo queremos desacoplar el protocolo de conexión a internet que pueden implementar distintos dispositivos.

Implementación:

// Abstraccion Interface
type DispositivoInterface interface {
    ConectarInternet() string
    SetConexion(Conexion)
}

// Abstraccion Abstracta
type Dispositivo struct {
    conexion Conexion
}

func (d *Dispositivo) SetConexion(conexion Conexion) {
    d.conexion = conexion
}

// Abstraccion Refinada
type Telefono struct {
    numero string
    *Dispositivo
}

func (t *Telefono) ConectarInternet() string {
    return "Teléfono N° " + t.numero + " conectado a internet mediante " + t.conexion.Conectar()
}

// Abstraccion Refinada
type Tablet struct {
    *Dispositivo
}

func (t *Tablet) ConectarInternet() string {
    return "Tablet conectada a internet mediante " + t.conexion.Conectar()
}

// Implementador Interface
type Conexion interface {
    Conectar() string
}

// Implementador Concreto
type Red4G struct{}

func (r *Red4G) Conectar() string {
    return "4G"
}

// Implementador Concreto
type RedWiFi struct{}

func (r *RedWiFi) Conectar() string {
    return "WiFi"
}

Se puede probar la implementación del patrón de la siguiente forma:

telefonoA := &Telefono{"0115161", &Dispositivo{}}
telefonoA.SetConexion(&Red4G{})
fmt.Printf("%s\n", telefonoA.ConectarInternet())

telefonoB := &Telefono{"0117854", &Dispositivo{}}
telefonoB.SetConexion(&RedWiFi{})
fmt.Printf("%s\n", telefonoB.ConectarInternet())

tablet := &Tablet{&Dispositivo{}}
tablet.SetConexion(&RedWiFi{})
fmt.Printf("%s\n", tablet.ConectarInternet())

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?