Bridge

Bridge

Introduktion:
Bridge pattern bruges til at afkoble en abstraktion fra dens implementation.
I stedet for at kombinere abstraktionerne og implementationerne til specifikke klasser, bruges Bridge pattern til at implementere abstraktionerne og implementationerne som uafhængige klasser, der kan kombineres dynamisk.

Motivation:
I forbindelse med udvikling af en applikation, ønskes det at der skal være mulighed for overvågning af en eller flere sensorer i løbet af afviklingen af programmet.
Dette kan være sensorer, der måler hastighed, varme, bevægelse o.s.v.
F.eks. vil hastighedsmåleren returnere en hastighed på et givent tidspunkt.
Varmemåleren vil returnere en gennemsnitlig varmeaflæsning.
bevægelsessensoren vil returnere en strøm af målinger.
Klienten ønsker at aflæse en måling på en sensor. Til de formål associeres et Sensor-objekt:

Fig. 1 Klient med Sensor-objekt
Fig. 1 Klient med Sensor-objekt
For at kunne registrere de forskellige sensorer der vil blive tilsluttet, laves et interface Sensor, der står for realiseringen af de måder aflæsningen skal ske på:
Fig. 2 Realisering for hver måde at håndtere aflæsning
Fig. 2 Realisering for hver måde at håndtere aflæsning.
Via den polymorfe metode measure() kan de informationer, der aflæses fra sensorerne nu dynamisk ændres.
Dette gøres ved at udskifte det objekt klienten refererer til med instanser af de forskellige sub klasser.
I tilfælde af at der er flere klienter, der skal aflæse sensorerne på samme tid, kan det blive upraktisk, da der så skal holdes styr på hvilket sensor-objekt en klient bruger.
I ovenstående tilfælde skulle der så kaldes en set-metode på alle klienterne.
Først når set-metoden på alle klienterne er kaldt, er udskiftningen færdig.

Problem:
Det skal være muligt dynamisk at udskifte det objekt, der er associeret til en klient uden at indvolvere klienten i dette. Dette skal kunne ske uden at ændre den reference klienten har til objektet.

Løsningen:
Til dette skal der bruges delegering.
Når klienten ønsker at kontakte en sensor, skal den ikke direkte kontakte den, men til et objekt, der aldrig udskiftes.
Dette delegerede objekt for så samme interface som Sensor-objektet, så klienterne ikke kan se forskel.

Fig. 3 Bridge Pattern
Fig. 3 Bridge Pattern.
Metoden setSensor() skal bemærkes, da den bruges til at sætte, hvilket objekt klienterne skal anvende.

Sourcekode til eksempel: Client.java
Message.java
Language.java
Danish.java
English.java

Dette er et lille eksempel fra min skoletid, som viser et simpelt bridge pattern.
Interfacet Language indeholder 3 metoder: hello(), bye() og err().
Klasserne Danish og English implementerer interfacet Language og tilføjer en System.out.println() i hver metode.
Klassen Message modtager et Language interface i sin constructor.
Den indeholder desuden metoder, der svarer til den i Language interfacet.
De kalder blot videre dertil. Til sidst har den en setLang() metode, der bruges til at skifte mellem klasserne Danish og English.
Klassen Client indeholder main() metoden og kører en lille test af bridge pattern.

Relaterede Patterns:
Abstract Factory - dette pattern kan bruges af Bridge Pattern til at bestemme hvilken klasse, der skal instantieres til et givet objekt.
Adapter Pattern - dette pattern bruges til at få forskellige klasser til at arbejde sammen.
Det tilføjes typisk til en applikation efter den er designet.