Wzorce projektowe: Bridge
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 public abstract class Rysunek { 2 protected RysunekImpl rysunekImpl; 3 4 protected int x; 5 protected int y; 6 7 public Rysunek( int x, int y, RysunekImpl rysunekImpl) { 8 this.x = x; 9 this.y = y; 10 this.rysunekImpl = rysunekImpl; 11 } 12 13 public void powiększ(int i) { 14 this.x *= i; 15 this.y *= i; 16 } 17 public abstract void rysuj(); 18 }
Konkretny obiekt:
1 public class KonkretnyRysunek extends Rysunek{ 2 3 public KonkretnyRysunek(int x, int y, RysunekImpl rysunekImpl) { 4 super(x, y, rysunekImpl); 5 } 6 7 public void rysuj() { 8 rysunekImpl.rysuj(x, y); 9 } 10 } 11
Implementacja i konkretni implementatorzy:
1 public interface RysunekImpl { 2 public void rysuj(int x , int y); 3 } 4
1 public class Drukowanie implements RysunekImpl{ 2 public void rysuj(int x, int y) { 3 System.out.printf("Drukuję obrazek o wymiarach %d na %d \n", x, y); 4 } 5 } 6
1 public class RysowanieNaEkranie implements RysunekImpl{ 2 public void rysuj(int x, int y) { 3 System.out.printf("Rysuję na ekranie rysunek o wymiarach %d na %d \n",x,y ); 4 } 5 } 6
Klient:
1 public class BridgeTester { 2 public static void main(String[] args) { 3 List<Rysunek> rysunki = new ArrayList<Rysunek>(); 4 5 rysunki.add(new KonkretnyRysunek(2, 3, new Drukowanie())); 6 7 rysunki.add(new KonkretnyRysunek(3, 4, new RysowanieNaEkranie())); 8 9 for (Rysunek r : rysunki) { 10 r.powiększ(2); //abstrakcja 11 r.rysuj(); //implementacja 12 } 13 } 14 } 15
