Köprü

Bu tasarım deseni, soyutlama ile gerçekleştirmeyi ayrı sınıf hiyerarşisi içinde ayırmak için kullanılır. Sınıflara daha fazla bir soyutlama ve genişleme imkanı tanır. Desende hem soyutlama kısmı, hem de gerçekleştirme kısmında bir üst sınıfı bulunur. Bu üst sınıfların altındaysa belirli bir sınıf hiyerarşisi bulunur. Bu iki hiyerarşi de birbirlerine bağlıdır. İşte desen, iki kısım arasında köprü gibi bir yapı olarak duran bu bağdan ismini almıştır. Soyutlama kısmında, sistemin daha üst düzey işlemleri bulunur. Gerçekleştirme kısmında ise, bu soyutlama kısmındaki üst düzey işlemlere bağlı daha basit ve bu üst düzey işlemleri detaylandıran işlemler bulunur. Sistemin gerçekleştirme ve soyutlama kısmında kalıcı bir bağlılık istemiyorsak, bu iki kısmında birbirlerinden bağımsız olarak alt sınıflarla genişlemesine imkan vermek istiyorsak, gerçekleştirme kısmını istemciden tamamen saklamak istiyorsak bu deseni kullanabiliriz.

Örnek :

Aşağıdaki köprü tasarım deseni örneğinde, soyutlama kısmında bir şekil hiyerarşisi, gerçekleştirme kısmında ise bu şekilleri çizmeye yarayan kalıp hiyerarşisi bulunmaktadır. Bu iki hiyerarşi birbirlerine şekil kısmının, kalıp kısmını sahiplenmesi ile bağlanmaktadır. Şekil kısmındaki çizim detayları kalıp sınıflarında yer almaktadır. Örnekte de görüldüğü gibi soyutlama ve gerçekleştirme birbirlerinden ayrılmıştır. Gerçekleştirme kısmı olan kalıp kısmında detay daha fazladır.

Örnek Sınıf Çizelgesi :

Örnek Java Kodu : ( Kodlar java 1.6.0.7 ile derlenip, çalıştırılmıştır. )

Şekil.java :

public abstract class Şekil {

protected ÇizimKalıbı kalıp;


public Şekil( ÇizimKalıbı kalıp ) {

this.kalıp = kalıp;

}


public abstract void çiz();

}

Çember.java :

public class Çember extends Şekil {


public Çember( ÇizimKalıbı kalıp ) {

super( kalıp );

}


@Override

public void çiz() {

kalıp.çemberÇiz();

}

}

Üçgen.java :

public class Üçgen extends Şekil {


public Üçgen( ÇizimKalıbı kalıp ) {

super( kalıp );

}


@Override

public void çiz() {

kalıp.çizgiÇiz();

kalıp.çizgiÇiz();

kalıp.çizgiÇiz();

}

}

Dikdörtgen.java :

public class Dikdörtgen extends Şekil {


public Dikdörtgen( ÇizimKalıbı kalıp ) {

super( kalıp );

}


@Override

public void çiz() {

kalıp.çizgiÇiz();

kalıp.çizgiÇiz();

kalıp.çizgiÇiz();

kalıp.çizgiÇiz();

}

}

ÇizimKalıbı.java :

public interface ÇizimKalıbı {

void çizgiÇiz();

void çemberÇiz();

}

Kalıp1.java :

public class Kalıp1 implements ÇizimKalıbı {


@Override

public void çemberÇiz() {

System.out.println( "Kalıp 1 ile çember çizildi." );

}


@Override

public void çizgiÇiz() {

System.out.println( "Kalıp 1 ile çizgi çizildi." );

}

}

Kalıp2.java :

public class Kalıp2 implements ÇizimKalıbı {


@Override

public void çemberÇiz() {

System.out.println( "Kalıp 2 ile çember çizildi." );

}


@Override

public void çizgiÇiz() {

System.out.println( "Kalıp 2 ile çizgi çizildi." );

}

}

ÇizimTahtası.java :

public class ÇizimTahtası {


public static void main(String[] args) {

Şekil[] şekiller = new Şekil[ 3 ];


// Şekil nesnelerini oluştur.

şekiller[ 0 ] = new Dikdörtgen( new Kalıp2() );

şekiller[ 1 ] = new Çember( new Kalıp1() );

şekiller[ 2 ] = new Üçgen( new Kalıp2() );


// Tüm şekilleri çiz.

for ( Şekil şekil : şekiller ) {

şekil.çiz();

}

}

}