Bridge örüntüsünün diğer örüntülere göre daha kompleks bir yapısı var lakin çok kullanışlı bir örüntü olduğunu deyinmeden de geçemem. Örüntümüzü örnek bir problemle ve bu probleme bakış açımızla adım adım ilerleyerek çözelim.
Daire çizmek için gereksinimiz drawCircle(x, y, r)
Çizgi çizmek için drawLine(x1, y1, x2, y2);
Bizden istenen dörtgen çizmemiz;
abstract class Rectangle {
public void draw () {
drawLine(_x1,_y1,_x2,_y1);
drawLine(_x2,_y1,_x2,_y2);
drawLine(_x2,_y2,_x1,_y2);
drawLine(_x1,_y2,_x1,_y1);
}
abstract protected void drawLine ( double x1, double y1,
double x2, double y2);
}
Bu seferde daire çizmemiz isteniyor.
abstract class Circle {
public void draw () {
drawCircle(x, y, r)
}
abstract protected void drawCircle ( double x, double y, double r);
}
Başka bir şekil istendiğinde, örneğin üçgen, yine soyut bir sınıfla tanımlamalarımızı yaparız ve onu extend eden bir sınıf yaratıp kullanırız. Fazla kötü gözükmüyor. Burda soyut sınıf kullanmadan da kodlamak mümkün. Biraz daha düşünmek gerekirse yukarıdaki örneklerden her şeklin çizimi kendi içinde. Açık kaynak proje ürettiğimizi düşünürsek başka bir yazılımcı benim yazdığım çizimlerden daha iyisini yapıyor. Bu durum herzaman mümkün daha iyisi vardır ya da daha iyisi olacak en büyük yanılgı yazdığı kodun en iyisi olduğunu düşünmektir. Daha iyisi yazılmış kodu kendi kodumuza entegre etmek bayağı zaman alacak gibi gözüküyor. Bu durumu düşünerek kodumuzu biraz daha bağımsız, modüler yapmaya çalışalım. Şekilleri ayrı, çizimleri ayrı düşünelim. Java programlama dili çoklu kalıtım desteği vermemektedir. Bizde şekil ve çizim tasarımlarımızı ayrı ayrı yapalım. Birini diğerine parametre geçirelim.
Kodu toparlayalım biraz;
abstract class Drawing{
abstract void drawLine ( double x1,double y1,double x2, double y2);
abstract void drawCircle ( double x, double y, double r);
}
class V1Drawing extends Drawing {
public void drawLine ( double x1,double y1, double x2,double y2) {
//Line kodu yazılır.
}
public void drawCircle ( double x,double y,double r) {
//Circle kodu yazılır.
}
}
abstract class Shape{
private Drawing dp;
Shape(Drawing dp;){ this.dp = dp}
abstract void draw();
public void drawLine drawLine ( double x1, double y1, double x2, double y2){
dp. drawLine(x1, y1, x2, y2);
}
public void drawCircle ( double x, double y, double r){
dp. drawCircle(x, y, r);
}
}
class Rectangle extends Shape {
public Rectangle ( Drawing dp, double x1,double y1, double x2,double y2) {
super( dp) ;
_x1= x1; _x2= x2 ;
_y1= y1; _y2= y2;
}
public void draw () {
drawLine(_x1,_y1,_x2,_y1);
drawLine(_x2,_y1,_x2,_y2);
drawLine(_x2,_y2,_x1,_y2);
drawLine(_x1,_y2,_x1,_y1);
}
}
class Circle extends Shape {
public Circle ( Drawing dp, double x,double y,double r) {
super( dp) ;
_x= x; _y= y; _r= r ;
}
public void draw () {
drawCircle(_x,_y,_r);
}
}
class Client {
public static void main(String argv[]) {
Shape r1, r2;
Drawing dp;
dp= new V1Drawing();
r1= new Rectangle(dp,1,1,2,2);
dp= new V2Drawing ();
r2= new Circle(dp,2,2,3);
r1.draw();
r2.draw();
}
}
Böylece dairemizi ve dörtgenimizi uygun bir çözümle yaratmış oluruz, az onceki problemize bir çözüm sunmuş durumdayız yani
dp= new V1Drawing();
yerine dp = new OtherDrawing(); //Bizden daha iyi kodlamış çizim sınıfını bu şekilde kendi kodumuzda çok az bir değişiklikle entegre edebiliriz.
Shape r1, r2;
Drawing dp;
dp= new V1Drawing();
r1= new Rectangle(dp,1,1,2,2);
dp= new V2Drawing ();
r2= new Circle(dp,2,2,3);
r1.draw();
Alan Shalloway, James R. Trott , Software Patterns Series kitabından alıntı yapılmıştır.
14 Nisan 2008 Pazartesi
Kaydol:
Kayıt Yorumları (Atom)
Hiç yorum yok:
Yorum Gönder