Adapter Pattern (Adaptör Tasarım Kalıbı), bir interface'i başka bir interface'e dönüştürerek iki farklı sistemin birlikte çalışmasını sağlayan yapısal tasarım desenidir. Farklı bileşenlerin uyumsuz API'leri arasında köprü görevi görerek, istemci kodun değişiklik yapmadan yeni bileşenlerle çalışmasını sağlar.
Ne Zaman Kullanılmalıdır?
Adapter Pattern şu durumlarda kullanışlıdır:
- Var olan kodu değiştirmeden yeni bir sistemle entegre etmek gerektiğinde.
- Uyumsuz bileşenler arasında köprü oluşturulması gerektiğinde.
- Kodun yeniden kullanılabilir olmasını sağlamak için.
- Var olan kodun tekrar yazılması maliyetli olduğunda.
Adapter Pattern'in Avantajları :
- Kodun yeniden kullanılmasını sağlar.
- Esneklik sağlar.
- Ayrıştırma sağlar.
Adapter Pattern'in Dezavantajları :
- Kodun karmaşıklığını artırabilir.
- Performans maliyeti olabilir.
Adapter Pattern Kullanım Biçimleri
1. Sınıf Tabanlı Adapter
interface OldSystem {
void oldRequest();
}
class NewSystem {
public void newRequest() {
System.out.println("Yeni sistem metodu çalışıyor.");
}
}
class Adapter extends NewSystem implements OldSystem {
@Override
public void oldRequest() {
System.out.println("Adaptör: Eski sistem çağrısı, yeni sistem metoduna yönlendiriliyor...");
newRequest();
}
}
public class Main {
public static void main(String[] args) {
OldSystem adapter = new Adapter();
adapter.oldRequest();
}
}
2. Nesne Tabanlı Adapter
interface OldSystem {
void oldRequest();
}
class NewSystem {
public void newRequest() {
System.out.println("Yeni sistem metodu çalışıyor.");
}
}
class ObjectAdapter implements OldSystem {
private NewSystem newSystem;
public ObjectAdapter(NewSystem newSystem) {
this.newSystem = newSystem;
}
@Override
public void oldRequest() {
System.out.println("Adaptör: Eski sistem çağrısı, yeni sistem metoduna yönlendiriliyor...");
newSystem.newRequest();
}
}
public class Main {
public static void main(String[] args) {
NewSystem newSystem = new NewSystem();
OldSystem adapter = new ObjectAdapter(newSystem);
adapter.oldRequest();
}
}
Gerçek Dünya Senaryosu: Farklı Şarj Adaptörleri
interface MicroUSBCharger {
void chargeWithMicroUSB();
}
class USBTypeCCharger {
public void chargeWithUSBTypeC() {
System.out.println("USB-C şarj cihazı kullanılıyor.");
}
}
class MicroUSBToUSBTypeCAdapter implements MicroUSBCharger {
private USBTypeCCharger usbTypeCCharger;
public MicroUSBToUSBTypeCAdapter(USBTypeCCharger usbTypeCCharger) {
this.usbTypeCCharger = usbTypeCCharger;
}
@Override
public void chargeWithMicroUSB() {
System.out.println("Adaptör: Micro-USB'den USB-C'ye çevirme işlemi yapılıyor...");
usbTypeCCharger.chargeWithUSBTypeC();
}
}
public class Main {
public static void main(String[] args) {
USBTypeCCharger usbCCharger = new USBTypeCCharger();
MicroUSBCharger adapter = new MicroUSBToUSBTypeCAdapter(usbCCharger);
adapter.chargeWithMicroUSB();
}
}
Sonuç
Adapter Design Pattern, farklı sistemlerin veya interface'lerin birbirleriyle sorunsuz bir şekilde çalışmasını sağlayan güçlü bir tekniktir. Gerçek dünyada sıkça veri dönüştürücüleri, eski sistem entegrasyonları ve farklı donanım interface'leri gibi senaryolarda kullanılır.