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
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.