Tasarım Kalıpları: Adapter Kalıbı

Adapter, dilimize adaptör olarak geçmiş olan kavramdır ve GoF’un yapısal kalıplarındandır. GoF’da bu kalıbın amacı şöyle fiade ediliyor:

Intent: Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn’t otherwise because of incompatible interfaces.

Amaç: Bir sınıfın arayüzünü, bir başka sınıfın beklediği arayüze çevir. Adaptör, uyumsuz arayüzleri sebebiyle çalışamayacak sınıfların bir arada çalışmalarını sağlar.

Adaptör, yapısal kalıpların en basitidir. Sıklıkla, farklı yapılarda geliştirilmiş sınıfları bir arada kullanmak isteriz. Sınıfların farklı yapıda olmaları, kullanım açısından bakıldığında temelde farklı arayüze sahip olmaları anlamına gelir. Farklı arayüze sahip sınıfları, ortak bir arayüz noktasında birleştirmek için adaptörler kullanılır. Bu anlamda adaptör kullanımı her türlü mühendislik disiplininde ve günlük hayatta sıklıkla başvurduğumuz yöntemlerdendir.

Örneğin bir arayüz geliştirip ona bir kaç alt sınıfta gerçekleştirmeler sağladınız. Sonra bir başka yerden farklı bir gerçekleştirme daha buldunuz ve onu da bu arayüzün altında kullanmak istiyorsunuz. Yapacağınız şey, arayüzünüz ile yeni sınıf arasına bir adaptör koymaktır. Bu durumu bir örnekle ele alalım:  Diyelim ki ABD’ye bir düreliğine gidiyorsunuz ve orada satın almak istemediğiniz traş makinası gibi size özel bir elektrikli aleti de yanınızda götürüyorsunuz. Bu durumda elektrikle ilgili bir uyumsuzluk yaşayacaksınız. Bu hal aşağıda modellenmiştir. Bu durumda Türk elektrikli ev aletlerini ABD’de nasıl çalıştırırız?

Bu durumu çözmenin yöntemi, PowerSource arayüzünü gerçekleştiren ama aynı zamanda USPowerSource ile de konuşabilen bir adaptör yaratmaktır: USTurkishPowerAdapter Bu durumda TurkishHomeAppliance nesneleri USTurkishPowerAdapter üzerinden USPowerSource kullanarak çalışabileceklerdir. Bu durumda şöyle bir modele ulaşırız.

ClassDiagram2

Örnek olarak USTurkishPowerAdapter adaptörü koduna da bakabiliriz.

package org.javaturk.dp.pattern.gof.structural.adapter.electricity.powerAdapter;

import org.javaturk.dp.pattern.gof.structural.adapter.electricity.PowerSource;
import org.javaturk.dp.pattern.gof.structural.adapter.electricity.us.USPowerSource;

public class USTurkishPowerAdapter implements PowerSource {
	private USPowerSource usPowerSource;
	
	public USTurkishPowerAdapter(USPowerSource usPowerSource){
		this.usPowerSource = usPowerSource;
		convert110To220(usPowerSource);
	}

	@Override
	public void providePowerAt220V() {
		usPowerSource.providePowerAt110V();
	}

	@Override
	public void turnOn() {
		usPowerSource.pushSwitch();
	}

	@Override
	public void turnOff() {
		usPowerSource.pushSwitch();
	}
	
	private void convert110To220(USPowerSource usPowerSource){
		System.out.println("USTurkishPowerAdapter: Converting from USPowerSource to provide 220V");
		// Do something here so that we can change USPowerSource 🙂
	}
}

Bazen adaptörler, uyumsuz nesneyi uyumlu hale getirmekten daha çok iş yapabilirler. Bu gibi durumlarda adaptör, uyumsuz nesneye gitmeden kendisi bazı hizmetler sağlayabilir. Örneğin USTurkishPowerAdapter adaptörü güvenlik amacıyla gücü TurkishHomeAppliance nesnesine iletmeden önce algıladı güç ile ilgili voltaj ve frekans gibi bilgileri gösterebilir. Bu anlamda adaptörün ne kadar iş yaptığı tamamen uyumsuzluğun büyüklüğüyle alakalıdır.

Peki size bir soru: USHomeApplicance nesnesini Türkiye’de nasıl çalıştırabiliriz? USTurkishPowerAdapter nesnesini nasıl değiştirelim ki iki yönlü adaptör görevi görsün ve USHomeApplicance nesneleri de TurkishPowerSource ile çalışabilsin?

Adaptör kalıbı, işimize yarayacak ama istediğimiz arayüze sahip olmayan nesnenin kullanılabilir hale getirir. Bunu da istediğimiz arayüze sahip olmayan nesnenin arayüzünü değiştirerek yapar. Artık o nesnenin yeni arayüzü adaptör nesnesi tarafından belirlenir. Adaptör bu anlamda uyumsuz nesnenin wrapperı olmuştur.

Bu yazı toplam 1448 defa görüntülenmiştir.