Bridge¶
Przeznaczenie
Umożliwia różnicowanie implementacji i abstrakcji przez umieszczenie obu elementów w osobnych hierarchiach klas
Bardziej elastyczny sposób separacji abstrakcji od implementacji niż stosowanie dziedziczenia
Kontekst
Istnieje wiele implementacji, które muszą być uwzględnione w projekcie
Klient korzysta z abstrakcyjnych klas w celu ujednolicenia interfejsu
Problem
Chcemy uniknąć stałego powiązania abstrakcji z jej implementacją – implementacja może być wybierana lub zmieniana w czasie wykonywania programu
Oczekujemy zmian zarówno w interfejsie abstrakcji jak i w implementacjach
Zmiany w implementacji abstrakcji nie powinny mieć wpływu na klientów
Chcemy całkowicie ukryć implementację abstrakcji przed klientami
Chcemy, żeby wiele obiektów współdzieliło implementację (np. używając liczników odwołań) i żeby ukryć to przed klientami
Struktura¶

Uczestnicy¶
Abstraction
definiuje interfejs abstrakcji
zarządza odwołaniem do obiektu typu Implementacja
RefinedAbstraction – rozszerza interfejs zdefiniowany przez klasę Abstraction
Implementor
definiuje interfejs klas implementujących, który nie musi dokładnie odpowiadać interfejsowi klasy Abstraction
zwykle interfejs implementacji określa jedynie operacje pierwotne, a Abstraction – wykorzystujące je operacje wyższego rzędu
ConcreteImplementor – implementuje interfejs klasy Implementor i definiuje jej implementację konkretną
Współpraca¶
Abstraction przesyła żądania klientów do swojego obiektu implementacji Implementor.
Konsekwencje¶
Separuje implementację, usuwając jej trwałe powiązanie z interfejsem. Implementacja abstrakcji może być ustalana w czasie wykonywania programu. Eliminuje zależność w czasie kompilacji od określonej implementacji.
Ułatwiona rozszerzalność. Można niezależnie rozbudowywać hierarchie abstrakcji i implementacji.
Zmiany w klasach rzeczywistych abstrakcji nie wpływają na klienta.
Przydatny w systemach graficznych i okienkowych, które muszą pracować na różnych platformach.
Zwiększa złożoność projektu.
Implementacja¶
Istnienie tylko jednej klasy implementacji.
Wzorce pokrewne¶
Abstract factory – może tworzyć i konfigurować poszczególne „mosty”.
Adapter:
dzięki temu wzorcowi niepowiązane ze sobą klasy mogą współpracować,
zwykle stosuje się go zaraz po zaprojektowaniu systemu, „mostu” natomiast używa się od samego początku projektowania,
chodzi o to, by abstrakcje i implementacje mogły się zmieniać niezależnie jedna od drugiej.