Yeni bir design pattern ve yeni bir tasarım kategorisi. Bu yazımla beraber yapısal tasarım kalıplarına geçmiş oluyoruz artık. Aslında Adapter design pattern, ismi ile uyuşan bir kalıp. İki uyumsuz yapıyı birbirine uyumlu hale getirmek için kullanılır. Böylece mevcutta bulunan componenti kullanarak istenilen işlemi yapmaya çalışır. Bir nevi delegate vazifesi görebilir diyebiliriz. İsterseniz örneğimize geçelim.

package designpattern.adapter;public class Notebook {private IUsb usb = null;public void plugUsb(IUsb usb) {
this.usb = usb;
}

public IUsb getUsb() {
return usb;
}
}

Elimizde bir notebook var ve bunun Usb girişi mevcut. Bu Usb üzerinden de veri alıyoruz. Hemen Usb arayüzüne bakalım.

package designpattern.adapter;public interface IUsb {public String getData();}

Basit bir data okuma metodu içeriyor arayüzümüz. Fakat elimizde Usb olmadığını bunun yerine çeşitli tipte SD kartlar olduğunu düşünelim ve bunları okumak istiyoruz.

package designpattern.adapter;public interface ISd {public static final String MICRO_SD = “MicroSD”;public static final String SD = “SD”;

public String readData();

}

Yine basit bir arayüz tanımladık. Her ne kadar iki arayüzde de aynı metot varsa da, arayüzlerin farklı oluşuna odaklanmamız gerekiyor. Şimdi SD arayüzünü tanımlayan iki sınıf yazalım.

package designpattern.adapter;public class MicroSD implements ISd {@Override
public String readData() {
return “Data from Micro SD”;
}}
package designpattern.adapter;public class Sd implements ISd {@Override
public String readData() {
return “Data from SD”;
}}

Burada Usb arayüzü olan bir notebook için SD kartlar kullanmak istiyoruz. Tıpkı gerçek hayatta olduğu gibi arada bir dönüştürücü, adapter kullanmamız lazım. İşte dananın kuyruğunun koptuğu yer.

package designpattern.adapter;public class SdAdapter implements IUsb {private ISd sdCard = null;public SdAdapter(String sdType) {
initializeSdCard(sdType);
}

private void initializeSdCard(String sdType) {
switch (sdType) {
case ISd.MICRO_SD:
sdCard = new MicroSD();
break;
case ISd.SD:
sdCard = new Sd();
break;
}
}

public ISd getSdCard() {
return sdCard;
}

@Override
public String getData() {
if (getSdCard() != null)
return getSdCard().readData();
else
return “Indalid sd type”;
}

}

Adapter sınıfımızın Usb olarak kullanılabilmesi için IUsb arayüzünü uygulaması gerekiyor. Bir parametre ile hangi tipte SD kart oluşturacağına karar verdi ve IUsb için override edilen metotta ISd arayüzünün metodu çağrıldı. Son olarak main sınıfı ve output.

package designpattern.adapter;

public class AdapterMain {

public static void main(String[] args) {

IUsb microSd = new SdAdapter(ISd.MICRO_SD);
IUsb sd = new SdAdapter(ISd.SD);
IUsb invalid = new SdAdapter(“Invalid”);

Notebook notebook = new Notebook();
notebook.plugUsb(microSd);
System.out.println(notebook.getUsb().getData());

notebook.plugUsb(sd);
System.out.println(notebook.getUsb().getData());

notebook.plugUsb(invalid);
System.out.println(notebook.getUsb().getData());

}

}

Data from Micro SD
Data from SD
Indalid sd type

Umarım açıklayıcı ve anlaşılır bir örnek olmuştur.

Bol Java’ lı günler dileğiyle… 😀

No responses yet

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.