Ce este
Șablonul Punte (Bridge) împarte un concept în două dimensiuni independente, astfel încât acestea să poată varia separat. De exemplu, forme și moduri de a le desena; mesaje și moduri de a le trimite.
Fără punte obții câte o clasă pentru fiecare combinație — VectorCircle, TextCircle, VectorSquare... — iar lista se tot înmulțește. Cu puntea, o parte o păstrează pe cealaltă ca un câmp: orice formă funcționează cu orice renderer.
Exemplu: forme și renderere
2 renderere × 2 forme ar însemna 4 clase combinate; aici sunt 2 + 2, conectate printr-un singur câmp de tip protocol — puntea.
Orice formă, orice renderer
Același cerc se desenează în două moduri doar pentru că păstrează un alt renderer. Adăugarea unui renderer sau a unei forme înseamnă o singură clasă nouă, niciodată un rând întreg de combinații.
Ieșire: program Python complet
from dataclasses import dataclass
from typing import Protocol
# O dimensiune: CUM desenăm.
class Renderer(Protocol):
def draw(self, name: str) -> str: ...
class VectorRenderer:
def draw(self, name: str) -> str:
return "desenăm forma " + name + " cu linii vectoriale netede"
class TextRenderer:
def draw(self, name: str) -> str:
return "desenăm forma " + name + " cu caractere text"
# Cealaltă dimensiune: CE desenăm. Câmpul renderer este puntea.
@dataclass
class Shape:
name: str
renderer: Renderer
def draw(self) -> str:
return self.renderer.draw(self.name)
shapes = [
Shape("circle", VectorRenderer()),
Shape("circle", TextRenderer()),
Shape("square", VectorRenderer()),
]
for s in shapes:
print(s.draw())
Când să îl folosești
Folosește-l atunci când observi o explozie de combinații: fiecare tip nou pe o axă te obligă să creezi clase noi pe cealaltă. Două axe independente — separă-le.
Renunță la el atunci când o dimensiune are exact o singură implementare. O punte spre un singur mal este doar un debarcader.
Avantaje și dezavantaje
Avantaje: cele două părți cresc independent; combinațiile vin gratuit; fiecare parte poate fi testată separat.
Dezavantaje: mai multă indirectare de la început; recunoașterea celor două axe din timp este cu adevărat dificilă — o separare prea timpurie creează o abstractizare de care nu are nevoie nimeni.