Ce este
Șablonul Bridge împarte un concept în două dimensiuni independente, ca ele să poată varia separat. Forme și moduri de a le desena; mesaje și moduri de a le trimite.
Fără punte obții câte un tip pentru fiecare combinație — VectorCircle, TextCircle, VectorSquare... — iar lista se înmulțește. Cu puntea, o parte păstrează o interfață către cealaltă: orice formă funcționează cu orice renderer.
Exemplu: forme și renderere
2 renderere × 2 forme ar însemna 4 tipuri combinate; aici sunt 2 + 2, legate printr-un singur câmp de tip interfață — puntea.
Orice formă, orice renderer
Același cerc se desenează în două feluri doar pentru că păstrează un alt renderer. Adăugarea unui renderer sau a unei forme adaugă un singur tip, niciodată un rând întreg de combinații.
Ieșire: program Go și rezultatul capturat
package main
import "fmt"
// O dimensiune: CUM desenăm.
type Renderer interface {
Draw(name string) string
}
type VectorRenderer struct{}
func (VectorRenderer) Draw(name string) string {
return "desenez " + name + " cu linii vectoriale fine"
}
type TextRenderer struct{}
func (TextRenderer) Draw(name string) string {
return "desenez " + name + " cu caractere text"
}
// Cealaltă dimensiune: CE desenăm. Câmpul renderer este puntea.
type Shape struct {
name string
renderer Renderer
}
func (s Shape) Draw() string {
return s.renderer.Draw(s.name)
}
func main() {
shapes := []Shape{
{name: "cerc", renderer: VectorRenderer{}},
{name: "cerc", renderer: TextRenderer{}},
{name: "pătrat", renderer: VectorRenderer{}},
}
for _, s := range shapes {
fmt.Println(s.Draw())
}
}
Când să îl folosești
Folosește-l când observi explozia combinațiilor: fiecare fel nou de pe o axă impune tipuri noi pe cealaltă. Două axe independente — desparte-le.
Renunță la el când o dimensiune are exact o singură implementare. O punte spre un singur mal este doar un ponton.
Avantaje și dezavantaje
Avantaje: cele două părți cresc independent; combinațiile vin gratis; fiecare parte se poate testa separat.
Dezavantaje: mai multă indirectare de la început; recunoașterea din timp a celor două axe este cu adevărat grea — despărțirea prea devreme creează o abstractizare de care nu are nevoie nimeni.