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 
  • Wykop
  • Blip
  • Twitter
  • Facebook
  • DZone
  • Digg
  • Blinklist
  • Delicious
  • Evernote
  • LinkedIn
  • Google Bookmarks
  • Google Buzz
  • Google Reader
  • Share/Bookmark

Podobne wpisy:

Leave a Reply