1. Co to jest wzorzec mostu

1.1 Definicja i koncepcja

Wzorzec mostu, znany także jako wzorzec Bridge, to rodzaj wzorca projektowego strukturalnego, który odcina abstrakcję od implementacji, pozwalając im na niezależną zmianę. W prostych słowach, wzorzec mostu to rozwiązanie, które separuje abstrakcję od implementacji.

1.2 Cel i efekt wzorca mostu

Głównym celem wzorca mostu jest odseparowanie części abstrakcyjnej od jej części implementacyjnej, tak aby mogły one zmieniać się i rozszerzać niezależnie. Jest to osiągane poprzez ustanowienie abstrakcyjnej klasy mostu, która jest powiązana z konkretną klasą implementacji.

2. Charakterystyka i zalety wzorca mostu

Najważniejsze cechy i zalety wzorca mostu obejmują:

  • Zwiększona skalowalność systemu. Zarówno abstrakcja, jak i implementacja mogą zostać niezależnie rozszerzone bez wpływu na siebie nawzajem.
  • Zgodność z zasadą otwarte/zamknięte. Część abstrakcyjna i część implementacyjna mogą być rozszerzane niezależnie od siebie bez wpływu na siebie nawzajem.
  • Przejrzystość szczegółów implementacji dla klienta, umożliwiająca ukrycie szczegółów implementacji przed użytkownikiem.

3. Przykłady zastosowań wzorca mostu

  • Gdy chcesz oddzielić implementację złożonego obiektu od jego abstrakcji, można użyć wzorca mostu. Może to pozytywnie wpłynąć na wydajność istniejącego kodu, zwłaszcza gdy program używa tylko części obiektu w czasie wykonywania.
  • Gdy potrzebujesz udostępnić określone stany implementacji wielu obiektów, a dla kodu klienta muszą one występować jako niezależne klasy.

4. Implementacja wzorca mostu w języku Golang

4.1 Wprowadzenie do diagramu klas UML

Bridge Pattern in Golang

4.2 Szczegółowe kroki implementacji

4.2.1 Zdefiniuj interfejs abstrakcyjnej roli

Najpierw definiujemy interfejs DrawAPI, oto konkretny kod:

// Interfejs abstrakcyjnej roli
type DrawAPI interface {
	DrawACircle(radius, x, y int)
}

4.2.2 Zaimplementuj klasę konkretnej roli

Następnie definiujemy dwie klasy: RedCircle i BlueCircle, które implementują metody interfejsu DrawAPI:

// Klasa konkretnej roli
type RedCircle struct {}

func (c *RedCircle) DrawACircle(radius, x, y int) {
    // logika rysowania czerwonego koła
}

type BlueCircle struct {}

func (c *BlueCircle) DrawACircle(radius, x, y int) {
    // logika rysowania niebieskiego koła
}

4.2.3 Zdefiniuj interfejs abstrakcyjnego mostu

Zdefiniuj interfejs mostu kształtu:

// Interfejs abstrakcyjnego mostu
type Shape interface {
	Draw()
}

4.2.4 Zaimplementuj klasę konkretnej mostu

Zaimplementuj klasę Circle, która implementuje interfejs Shape i zawiera obiekt typu interfejs DrawAPI:

// Klasa konkretnej mostu
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 Przykład wywołania klienta

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

    redCircle.Draw()
    blueCircle.Draw()
}

W ten sposób zaimplementowaliśmy wzorzec mostu w języku Golang.