1. Was ist das Brückenmuster

1.1 Definition und Konzept

Das Brückenmuster, auch als Bridge-Muster bekannt, ist ein strukturelles Entwurfsmuster, das die Abstraktion von der Implementierung entkoppelt und es ermöglicht, dass sie unabhängig voneinander variieren. Einfach ausgedrückt ist das Brückenmuster eine Lösung, die die Abstraktion von der Implementierung trennt.

1.2 Zweck und Wirkung des Brückenmusters

Der Hauptzweck des Brückenmusters besteht darin, den Abstraktionsteil von seinem Implementierungsteil zu entkoppeln, sodass sie unabhängig voneinander geändert und erweitert werden können. Dies wird durch die Einrichtung einer abstrakten Brückenklasse erreicht, die mit einer konkreten Implementierungsklasse verknüpft ist.

2. Merkmale und Vorteile des Brückenmusters

Einige der Hauptmerkmale und Vorteile des Brückenmusters sind:

  • Verbesserte Skalierbarkeit des Systems. Sowohl die Abstraktion als auch die Implementierung können unabhängig voneinander erweitert werden, ohne sich gegenseitig zu beeinflussen.
  • Einhaltung des Open/Closed-Prinzips. Der Abstraktionsteil und der Implementierungsteil können unabhängig voneinander erweitert werden, ohne sich gegenseitig zu beeinflussen.
  • Transparenz der Implementierungsdetails für den Client, was die Verdeckung von Implementierungsdetails für den Benutzer ermöglicht.

3. Anwendungsszenarien des Brückenmusters

  • Wenn Sie die Implementierung eines komplexen Objekts von seiner Abstraktion trennen möchten, kann das Brückenmuster verwendet werden. Dies kann sich positiv auf die Leistung des bestehenden Codes auswirken, insbesondere wenn das Programm zur Laufzeit nur einen Teil des Objekts verwendet.
  • Wenn Sie bestimmte Implementierungszustände unter mehreren Objekten gemeinsam nutzen müssen, diese aber für den Clientcode als unabhängige Klassen erscheinen müssen.

4. Implementierung des Brückenmusters in Golang

4.1 Einführung in das UML-Klassendiagramm

Brückenmuster in Golang

4.2 Detaillierte Implementierungsschritte

4.2.1 Definition des abstrakten Rollen-Interfaces

Zunächst definieren wir ein DrawAPI-Interface. Der spezifische Code lautet wie folgt:

// Abstraktes Rollen-Interface
type DrawAPI interface {
	DrawACircle(radius, x, y int)
}

4.2.2 Implementierung der konkreten Rollenklasse

Dann definieren wir zwei Klassen, RedCircle und BlueCircle, die die Methoden im DrawAPI-Interface implementieren:

// Konkrete Rollenklasse
type RedCircle struct {}

func (c *RedCircle) DrawACircle(radius, x, y int) {
    // Logik zum Zeichnen eines roten Kreises
}

type BlueCircle struct {}

func (c *BlueCircle) DrawACircle(radius, x, y int) {
    // Logik zum Zeichnen eines blauen Kreises
}

4.2.3 Definition des abstrakten Brücken-Interfaces

Definition des Shape-Brücken-Interfaces:

// Abstraktes Brücken-Interface
type Shape interface {
	Draw()
}

4.2.4 Implementierung der konkreten Brückenklasse

Implementierung der Circle-Klasse, die das Shape-Interface implementiert und ein Objekt vom Typ DrawAPI-Interface enthält:

// Konkrete Brückenklasse
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 Beispiel für die Clientaufruf

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

    redCircle.Draw()
    blueCircle.Draw()
}

Auf diese Weise haben wir das Brückenmuster in Golang implementiert.