1. ¿Qué es el Patrón de Puente

1.1 Definición y Concepto

El Patrón de Puente, también conocido como patrón Bridge, es un tipo de patrón de diseño estructural que desacopla la abstracción y la implementación, permitiendo que varíen de forma independiente. En términos sencillos, el Patrón de Puente es una solución que separa la abstracción de la implementación.

1.2 Propósito y Efecto del Patrón de Puente

El propósito principal del Patrón de Puente es desacoplar la parte de abstracción de su parte de implementación para que puedan cambiar y expandirse de forma independiente. Esto se logra estableciendo una clase puente abstracta que está vinculada a una clase de implementación concreta.

2. Características y Ventajas del Patrón de Puente

Algunas de las principales características y ventajas del Patrón de Puente incluyen:

  • Mejora de la escalabilidad del sistema. Tanto la abstracción como la implementación pueden extenderse de forma independiente sin afectarse mutuamente.
  • Cumplimiento del Principio de Abierto/Cerrado. La parte de abstracción y la parte de implementación pueden extenderse de forma independiente sin afectarse mutuamente.
  • Transparencia de los detalles de implementación para el cliente, permitiendo ocultar los detalles de la implementación del usuario.

3. Escenarios de Aplicación del Patrón de Puente

  • Cuando se desea separar la implementación de un objeto complejo de su abstracción, se puede utilizar el Patrón de Puente. Esto puede tener un impacto positivo en el rendimiento del código existente, especialmente cuando el programa solo utiliza una parte del objeto en tiempo de ejecución.
  • Cuando se necesite compartir estados de implementación específicos entre varios objetos, pero para el código del cliente, estos deben aparecer como clases independientes.

4. Implementación del Patrón de Puente en Golang

4.1 Introducción al Diagrama de Clase UML

Patrón de Puente en Golang

4.2 Pasos detallados de la Implementación

4.2.1 Definir la Interfaz de Papel Abstracto

Primero, definimos una interfaz DrawAPI, el código específico es el siguiente:

// Interfaz de papel abstracto
type DrawAPI interface {
	DrawACircle(radius, x, y int)
}

4.2.2 Implementar la Clase de Papel Concreto

Luego, definimos dos clases, RedCircle y BlueCircle, que implementan los métodos en la interfaz DrawAPI:

// Clase de papel concreto
type RedCircle struct {}

func (c *RedCircle) DrawACircle(radius, x, y int) {
    // lógica para dibujar un círculo rojo
}

type BlueCircle struct {}

func (c *BlueCircle) DrawACircle(radius, x, y int) {
    // lógica para dibujar un círculo azul
}

4.2.3 Definir la Interfaz del Puente Abstracto

Definir la interfaz de puente Shape:

// Interfaz de puente abstracto
type Shape interface {
	Draw()
}

4.2.4 Implementar la Clase del Puente Concreto

Implementar la clase Circle, que implementa la interfaz Shape y contiene un objeto de tipo interfaz DrawAPI:

// Clase de puente concreto
type Circle struct {
    x, y, radius int
    drawAPI      DrawAPI
}

func (c *Circle) Draw() {
    c.drawAPI.DrawACircle(c.radius, c.x, c.y)
}

4.2.5 Ejemplo de Invocación del Cliente

func main() {
    redCircle := &Circle{100, 100, 10, new(RedCircle)}
    blueCircle := &Circle{100, 100, 10, new(BlueCircle)}

    redCircle.Draw()
    blueCircle.Draw()
}

De esta manera, hemos implementado el patrón de Puente en Golang.