Adapter Design Pattern

Merhaba, bir önceki yazıda composite design patternden bahsetmiştim. Bu yazıda ise Adapater patternden bahsediyorum.

nedir

Adapter pattern isminden de anlaşılacağı üzere iki classı birbirine adapte etmek için kullanılır. Çok büyük olasılıkla bir service kullanmak istediğimiz zaman ihtiyaç duyarız. Çünkü kullanmak istediğimiz service bizim ihtiyaç duyduğumuz metotları içerebilir fakat metot dönüş parametreleri vs. şeyler kendi yazdığımı yapıya uymaya bilir. İşte bu yüzden service i kendi projemize adapte ederiz.

Aşağıdaki örnekde WeatherService classı dışardan alınan bir service olarak düşünülmelidir. Yani bu classın hiçbir şekilde içindeki metotlara erişimimiz yok , sadece kullanabiliyoruz.

package blog;

public class WeatherManager {
	
	private IWeather Iservice;
	
	public WeatherManager(IWeather Iservice) {
		this.Iservice = Iservice;
	}
	
	public void getPrediction() {
		System.out.println("prediction: ");
		Iservice.notifyPrediction();
	}
}
package blog;

// Suppose this class is untouchable because of this comes from service 
public class WeatherService {

	public void prediction() {
		System.out.println("prediction notified with WeatherService");
	}
}
package blog;

public class WeatherServiceAdapter implements IWeather {

	@Override
	public void notifyPrediction() {
		
		WeatherService service = new WeatherService();
		service.prediction();
	}

}
package blog;

public class MyWeather implements IWeather {

	@Override
	public void notifyPrediction() {
		System.out.println("prediction notified with my own system");
	}

}
package blog;

public interface IWeather {
	public void notifyPrediction();

}
package blog;

public class Test {
	
	public static void main(String[] args) {
		
		
		WeatherManager manager = new WeatherManager(new MyWeather());
		manager.getPrediction();
		
		WeatherManager withService = new WeatherManager(new WeatherServiceAdapter());
		withService.getPrediction();
		
	}
}