Most (ang. Bridge) (wzorzec strukturalny) ma za zadanie oddzielić abstrakcję obiektu od jego implementacji dzięki czemu istnieje możliwość modyfikacji implementacji bez dokonywania zmian w kodzie klasy abstrakcji i na odwrót. Obiekt abstrakcji nie jest odpowiedzialny za sposób realizacji metod abstrakcji, ponieważ wywołuje on implementacje tych metod na wstrzykniętym obiekcie. Ukrywa on implementacje przed klientem oraz ułatwia rozbudowę, a także sprawia, że kod staje się czytelniejszy. Jak sama nazwa wskazuje jest on mostem - łącznikiem między abstrakcją, a implementacją. Implementacja logiki może być inicjalizowana dynamicznie.
Ograniczenia
Ze względu na podobieństwa w strukturze, wzorzec ten może być mylony ze wzorcami Adapter i Strategia, które mają inny cel. Należy zatem się upewnić, czy wybór wzorca Most jest właściwy. Poza tym może powstać zbyt wiele klas abstrakcji oraz implementacji.
Użycie
Wzorzec ten może przypominać Adapter jednakże główna różnica polega na tym, że Adapter stosowany jest do istniejącego niekompatybilnego kodu, natomiast Most używany jest w trakcie tworzenia i rozszerzania kodu. Ponadto używa podobnej struktury jak Strategia, jednakże celem wzorca Strategia jest przede wszystkim dynamiczna zmiana zachowania obiektu w zależności od sytuacji. Most warto użyć tam gdzie istnieje potrzeba odspeparowania implementacji od podmiotu przy jednoczesnym ukryciu szczegółów przed klientem. Wzorzec ten kieruje się zasadą kompozycja ponad dziedziczenie.
Implementacja
Klasy abstrakcji implementują interfejs Abstraction oraz zawierają referencje do wstrzykniętej implementacji Implementor. Klient tworzy obiekt klasy abstrakcji wraz ze wstrzyknięciem obiektu konkretnej klasy logiki, która implementuje interfejs Implementor.
Poniższy listing przedstawia implementację interfejsów Abstraction oraz Implementor.
Wybór implementacji podejmowany jest na podstawie oczekiwań systemu co przedstawia się następująco.
Przykład
Aplikacja Writer umożliwia zarządzanie dokumentami tekstowymi DocumentWriter oraz arkuszami kalkulacyjnymi SheetWriter w pamięci urządzenia. W zależnosci od wybranego typu dokumentu, zmienia się graficzny interfejs użytkownika (kolor, przybornik edytora itp). Aplikacja jest dostępna na różne wersje API, w związku z czym dla telefonów od Lollipop, wymagane jest pytanie użytkownika aplikacji o pozwolenie systemowe (np.: zapis do pamięci). Aplikacja musi zatem być elastyczna w sprawie graficznego interfejsu oraz zarządzania pozwoleniami czy pamiecią systemu. Poniższy listing przedstawia rozwiązanie tego problemu przy użyciu wzorca Most.
W przypadku rozszerzenia aplikacji o nowy typ dokumentu lub obsługę po stronie API, wystarczy dodać kolejny typ abstrakcji Abstraction lub implementacje Implementor. Takie podejście zapewnia dobrze zorganizowaną strukturę projektu, a implementacja może być dynamicznie zmieniana.
Biblioteki
Frameworki wstrzykiwania zależności mogą być pomocne w obsłudze wzorca Most, jednakże ze względu na prostotę wzorca oraz mnogość problemów, implementacja wzorca spoczywa na barkach programisty.