Wzorzec projektowy Bridge jest strukturalnym wzorcem projektowym, który pozwala oddzielić abstrakcję obiektu od jego implementacji przez co mogą być oddzielnie rozszerzane. Pozwala to wprowadzać oddzielnie zmiany do każdej z dwóch hierarchii klas.
Działanie wzorca polega na tym, że abstrakcja definiuje ogólny wygląd obiektu, a jego działania są przekazywane do implementacji.
Implementacja niejednokrotnie jest uzależniona od systemu zewnętrznego i może być dostarczona przez któryś z wzorców produkujących. Dla przykładu może istnieć abstrakcja Rysunek i mieć metodę rysuj(), która będzie przeniesiona do implementacji ponieważ inaczej się rysuje na papierze a inaczej na ekranie.
Abstrakcja:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public abstract class Rysunek { protected RysunekImpl rysunekImpl; protected int x; protected int y; public Rysunek( int x, int y, RysunekImpl rysunekImpl) { this.x = x; this.y = y; this.rysunekImpl = rysunekImpl; } public void powieksz(int i) { this.x *= i; this.y *= i; } public abstract void rysuj(); } |
Konkretny obiekt:
1 2 3 4 5 6 7 8 9 10 11 |
public class KonkretnyRysunek extends Rysunek{ public KonkretnyRysunek(int x, int y, RysunekImpl rysunekImpl) { super(x, y, rysunekImpl); } public void rysuj() { rysunekImpl.rysuj(x, y); } } |
Implementacja i konkretni implementatorzy:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public interface RysunekImpl { public void rysuj(int x , int y); } public class Drukowanie implements RysunekImpl{ public void rysuj(int x, int y) { System.out.printf("Drukuję obrazek o wymiarach %d na %d \n", x, y); } } public class RysowanieNaEkranie implements RysunekImpl{ public void rysuj(int x, int y) { System.out.printf("Rysuję na ekranie rysunek o wymiarach %d na %d \n",x,y ); } } |
Klient:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class BridgeTester { public static void main(String[] args) { List<Rysunek> rysunki = new ArrayList<Rysunek>(); rysunki.add(new KonkretnyRysunek(2, 3, new Drukowanie())); rysunki.add(new KonkretnyRysunek(3, 4, new RysowanieNaEkranie())); for (Rysunek r : rysunki) { r.powieksz(2); //abstrakcja r.rysuj(); //implementacja } } } |