Köprü modeli nedir?
Köprü deseni yapısal bir tasarım desenidir. Diğer bir deyişle, asıl işi, sınıflardan ve nesnelerden tam teşekküllü bir yapı oluşturmaktır. Bir köprü bunu, bir veya daha fazla sınıfı ayrı hiyerarşilere bölerek yapar: soyutlama ve uygulama . Bir hiyerarşideki işlevsellik değişikliği, diğerinde bir değişiklik gerektirmez. Hepsi iyi ve güzel, ancak bu tanım çok geniş ve en önemli soruyu yanıtlamıyor: "Köprü modeli nedir?" Pratik uygulamasını anlamanızın daha kolay olacağını düşünüyorum. O halde hemen köprü paterni için klasik bir senaryo oluşturalım.Shape
Genel bir geometrik şekli temsil eden soyut bir sınıfımız var :
-
Shape.java
public abstract class Shape { public abstract void draw(); }
Üçgen ve dikdörtgen gibi şekiller eklemeye karar verdiğimizde, onların sınıfı devralmasını sağlayacağız
Shape
: -
Dikdörtgen.java:
public class Rectangle extends Shape { @Override public void draw() { System.out.println("Drawing rectangle"); } }
-
Üçgen.java:
public class Triangle extends Shape { @Override public void draw() { System.out.println("Drawing triangle"); } }
draw()
bu renge bağlı olacaktır. Yöntemin farklı uygulamalarına sahip olmak için draw()
, her şekil-renk kombinasyonu için bir sınıf oluşturmamız gerekir. Üç rengimiz varsa, altı sınıfa ihtiyacımız var: TriangleBlack
, TriangleGreen
, TriangleRed
, ve . Altı ders o kadar büyük bir problem değil. Ancak! Yeni bir şekil veya renk eklememiz gerekirse, sınıf sayısı katlanarak artar. Bu durumdan nasıl çıkılır? Rengi bir alanda depolamak ve koşullu ifadeleri kullanarak tüm seçenekleri sıralamak en iyi çözüm değildir. İyi bir çözüm, rengi ayrı bir arayüze taşımaktır.RectangleBlack
RectangleGreen
RectangleRed
. Color
Söylendiği anda yapılır: üç uygulamalı bir arayüz oluşturalım : BlackColor
, GreenColor
ve RedColor
:
-
Color.java:
public interface Color { void fillColor(); }
-
BlackColor.java:
public class BlackColor implements Color { @Override public void fillColor() { System.out.println("Filling in black color"); } }
-
GreenColor.java
public class GreenColor implements Color { @Override public void fillColor() { System.out.println("Filling in green color"); } }
-
RedColor.java
public class RedColor implements Color { @Override public void fillColor() { System.out.println("Filling in red color"); } }
Color
Şimdi sınıfa bir alan ekliyoruzShape
. Yapıcıdaki değerini alacağız. -
Shape.java:
public abstract class Shape { protected Color color; public Shape(Color color) { this.color = color; } public abstract void draw(); }
color
Değişkeni uygulamalarda kullanacağızShape
. Bu, şekillerin artık arayüzün işlevselliğini kullanabileceği anlamına gelirColor
. -
Dikdörtgen.java
public class Rectangle extends Shape { public Rectangle(Color color) { super(color); } @Override public void draw() { System.out.println("Drawing rectangle"); color.fillColor(); } }
Color color
, iki ayrı sınıf hiyerarşisini birbirine bağlayan bir köprüdür.
Bir köprü nasıl kurulur: soyutlama ve uygulama
Köprü modelini gösteren bir sınıf diyagramına bakalım:
- Soyutlama
Shape
sınıftır - RefinedAbstraction,
Triangle
veRectangle
sınıflarıdır Color
Uygulayıcı arabirimdir- ConcreteImplementor
BlackColor
,GreenColor
veRedColor
sınıflarıdır.
Shape
bir soyutlamadır - şekillerin çeşitli renklerle doldurulmasını yönetmek için arabirime Color
(Uygulayıcı) yetki veren bir mekanizma. Triangle
ve sınıfları , sınıf Rectangle
tarafından sağlanan mekanizmayı kullanan somut sınıflardır Shape
. BlackColor
ve GreenColor
Uygulama RedColor
hiyerarşisindeki somut uygulamalardır.
Köprü deseni nerede kullanılır?
Bu modeli kullanmanın en büyük yararı, bir hiyerarşideki işlevsel sınıflarda diğerinin mantığını bozmadan değişiklik yapabilmenizdir. Ayrıca, bu yaklaşım sınıflar arasındaki eşleşmeyi azaltmaya yardımcı olur. Bu kalıbı kullanırken temel gereklilik "talimatları takip et" - hiçbirini göz ardı etmeyin! Bunun için köprü kalıbını mutlaka kullanmanız gereken durumlara bir göz atalım:-
İki kavramın kombinasyonlarına (örn. şekiller ve renkler) dayalı varlık sayısını artırmanız gerekiyorsa.
-
Tek sorumluluk ilkesini karşılamayan büyük bir sınıfı, dar işlevselliğe sahip daha küçük sınıflara bölmek istiyorsanız.
-
Program çalışırken belirli varlıkların mantığında değişiklik yapmak gerekirse.
-
Bir uygulamayı sınıfın veya kitaplığın istemcilerinden gizlemek gerekirse.
Desenin artıları ve eksileri
Diğer modeller gibi, bir köprünün de hem avantajları hem de dezavantajları vardır. Köprü modelinin avantajları:- Kodun ölçeklenebilirliğini artırır — programın başka bir bölümünde bir şeyi bozma korkusu olmadan işlevsellik ekleyebilirsiniz.
- Aksi takdirde varlıkların sayısı iki kavramın (örneğin, şekiller ve renkler) kombinasyonlarına dayandığında, alt sınıfların sayısını azaltır.
- Soyutlama ve Uygulama olmak üzere iki ayrı hiyerarşi üzerinde ayrı ayrı çalışmayı mümkün kılar. İki farklı geliştirici, birbirlerinin kodlarının ayrıntılarına girmeden değişiklik yapabilir.
- Sınıflar arasındaki eşleşmeyi azaltır — iki sınıfın birleştiği tek yer köprüdür (yani alan
Color color
).
- Bir projenin özel durumuna ve genel yapısına bağlı olarak, programın performansını olumsuz etkileyebilir (örneğin, daha fazla nesneyi başlatmanız gerekiyorsa).
- İki sınıf arasında geçiş yapma ihtiyacı nedeniyle kodu daha az okunabilir hale getirir.
GO TO FULL VERSION