1. O que é o Padrão Bridge

1.1 Definição e Conceito

O Padrão Bridge, também conhecido como padrão Bridge, é um tipo de padrão de design estrutural que desacopla a abstração e a implementação, permitindo que variem de forma independente. Em termos simples, o Padrão Bridge é uma solução que separa a abstração da implementação.

1.2 Propósito e Efeito do Padrão Bridge

O principal propósito do Padrão Bridge é desacoplar a parte de abstração de sua parte de implementação para que possam mudar e expandir independentemente. Isso é feito estabelecendo uma classe de ponte abstrata que está vinculada a uma classe de implementação concreta.

2. Características e Vantagens do Padrão Bridge

Algumas das principais características e vantagens do Padrão Bridge incluem:

  • Escalabilidade aprimorada do sistema. Tanto a abstração quanto a implementação podem ser estendidas independentemente sem afetar uma à outra.
  • Conformidade com o Princípio Aberto/Fechado. A parte de abstração e a parte de implementação podem ser estendidas independentemente sem afetar uma à outra.
  • Transparência de detalhes de implementação para o cliente, permitindo a ocultação de detalhes de implementação do usuário.

3. Cenários de Aplicação do Padrão Bridge

  • Quando se deseja separar a implementação de um objeto complexo de sua abstração, o Padrão Bridge pode ser utilizado. Isso pode ter um impacto positivo no desempenho do código existente, especialmente quando o programa utiliza apenas uma parte do objeto em tempo de execução.
  • Quando é necessário compartilhar estados de implementação específicos entre vários objetos, mas, para o código do cliente, eles precisam parecer como classes independentes.

4. Implementação do Padrão Bridge em Golang

4.1 Introdução ao Diagrama de Classes UML

Padrão Bridge em Golang

4.2 Etapas de Implementação Detalhadas

4.2.1 Definir a Interface de Papel Abstrato

Primeiramente, definimos uma interface DrawAPI, o código específico é o seguinte:

// Interface de papel abstrato
type DrawAPI interface {
    DrawACircle(raio, x, y int)
}

4.2.2 Implementar a Classe de Papel Concreto

Em seguida, definimos duas classes, RedCircle e BlueCircle, que implementam os métodos na interface DrawAPI:

// Classe de papel concreto
type RedCircle struct {}

func (c *RedCircle) DrawACircle(raio, x, y int) {
    // lógica para desenhar um círculo vermelho
}

type BlueCircle struct {}

func (c *BlueCircle) DrawACircle(raio, x, y int) {
    // lógica para desenhar um círculo azul
}

4.2.3 Definir a Interface de Ponte Abstrata

Definir a interface de ponte Shape:

// Interface de ponte abstrata
type Shape interface {
    Draw()
}

4.2.4 Implementar a Classe de Ponte Concreta

Implementar a classe Circle, que implementa a interface Shape e contém um objeto do tipo DrawAPI:

// Classe de ponte concreta
type Circle struct {
    x, y, raio int
    drawAPI    DrawAPI
}

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

4.2.5 Exemplo de Chamada do Cliente

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

    circuloVermelho.Draw()
    circuloAzul.Draw()
}

Dessa forma, implementamos o padrão Bridge em Golang.