• Cts. Eyl 18th, 2021

Adapter Design Pattern Ve Java İle Örneklemesi

Merhabalar. Bu yazıda size Adapter Design Pattern‘dan bahsedeceğim ve Java ile örnekleyeceğim.

Öncelikle bu design pattern hangi sorundan ötürü çıkmış buna bakalım.

Diyelim ki sizin bir uygulamanız var ve bu uygulamanız başka bir uygulama ile XML veri tipi ile sorunsuzca haberleşiyor, her şey güllik gülistanlık.

Sonra bir gün uygulamanızı başka bir uygulama ile daha entegre etmeniz icap etti fakat bu yeni uygulama JSON veri tipi ile haberleşiyor. Fakat sizin uygulamanız XML veri tipi haberleşecek, çalışacak şekilde yazılmıştı. Uygulamanız mevcut işleyişine dokunmadan nasıl çözeriz bu sorunu? 🤔

İşte bu durumda uygulamanızın çalışma şeklini doğrudan etkilemeden mevcut sistem ile yeni entegrasyon arasında adapter görevi görecek bir yapı kurarak uygulamanızın yeni entegre olacak uygulama ile sorunsuz entegre olmasını sağlayabilirsiniz.

Şimdi Adapter Desing Pattern’i basitçe örnekleyelim.

RoundHole.java

package com.ilkaygunel.adapter;

public class RoundHole {
    private double radius;

    public RoundHole(double radius) {
        this.radius = radius;
    }

    public double getRadius() {
        return radius;
    }

    public boolean fits(RoundPeg peg) {
        boolean result;
        result = (this.getRadius() >= peg.getRadius());
        return result;
    }
}

RoundHole sınıfını bir bölgeyi çevreleyen bir çember çizimi gibi düşünebiliriz. Sınıf içerisinde yarıçapı simgeleyecek radius değişkeni, radius’un get metodu, radius parametresi ile nesne oluşturmayı amaçlayan bir constructor ve bir de fits metodu bulunuyor. fits metodu RoundPeg tipinde ve RoundHole gibi radius değişkenine sahip olan bir parametre alıyor. fits metodunun amacı gelen parametrenin yarıçapının sınıf içerisindeki yarıçaptan büyük olup olmadığını kontrol ederek çemberin içine koyulabiliyor mu yoksa dışına mı taşıyor bunu anlamaktır.

RoundPeg.java

package com.ilkaygunel.adapter;

public class RoundPeg {
    private double radius;

    public RoundPeg() {}

    public RoundPeg(double radius) {
        this.radius = radius;
    }

    public double getRadius() {
        return radius;
    }
}

RoundPeg sınıfını da RoundHole sınıfındaki çember çiziminin üstüne koyulacak ikinci bir çember çizimi gibi düşünebiliriz. Bu sınıf da bir yarıçap değişkenine sahip.

SquarePeg.java

package com.ilkaygunel.adapter;

public class SquarePeg {
    private double width;

    public SquarePeg(double width) {
        this.width = width;
    }

    public double getWidth() {
        return width;
    }

    public double getSquare() {
        double result;
        result = Math.pow(this.width, 2);
        return result;
    }
}

SquarePeg sınıfı isminden de anlayabileceğimiz gibi kare ile ilgili bir sınıf. İçerisinde genişliği belirten bir width değişkeni, değişkene ait get metodu, parametreli bir yapılandırıcı ve karenin alanını veren getSquare metodu mevcut.

SquarePeg sınıfımız kare ile ilişkili bir sınıf olduğundan RoundHole ve RoundPeg gibi yarıçap özelliğine sahip değil. Fakat RoundHole içerisindeki fits metodunu kullanabilmek için bizim RoundPeg tipinde olan ve yarıçap bilgisine sahip olan bir objeye ihtiyacımız var. İşte bu noktada SquarePeg için bir Adapter yazarak SquarePeg’i mevcut kısma entegre edeceğiz.

SquarePegAdapter.java

package com.ilkaygunel.adapter;

public class SquarePegAdapter extends RoundPeg {
    private SquarePeg peg;

    public SquarePegAdapter(SquarePeg peg) {
        this.peg = peg;
    }

    @Override
    public double getRadius() {
        double result;
        result = (Math.sqrt(Math.pow((peg.getWidth() / 2), 2) * 2));
        return result;
    }
}

RoundHole sınıfı içerisindeki fits metodu RoundPeg tipinde obje kabül ettiğinden SquarePegAdapter sınıfımızı da RoundPeg sınıfımızdan kalıtıyoruz ve içerisinde SquarePeg değişkeni tanımlıyoruz. Parametre kabul eden yapılandırıcımız sınıf içerisindeki peg değişkenine gelen parametreyi atıyor. RoundPeg sınıfından gelen ve override edilen getRadius() metodu ile kareyi çevreleyen ve minumun boyutta olan çemberin yarıçap bilgisi elde ediliyor. Bu üretilen yarıçap bilgisi ile karenin sığıp sığmama kontrolü yapılacak.

Burada kullanılan formül ile ilgili not paylaşmak gerekirse bir kareyi çevreleyen bir çember olduğunu düşünürseniz eğer bu çember 4 noktadan kare ile temas eder. Bu noktalardan bir tanesinden karenin tam ortasına kadar olacak şekilde bir çizgi çekerseniz bu yarıçap olur ve bu yarıçapın uzunluğu da bir kenarının yarısının kök 2 katına eşit olur. Yukarıdaki formül de widht bilgisinin yarısını alıp çıkan sonucun karesini alıp onu da 2 ile çarptıktan sonra son çıkan sonucun kare kökünü alıyor.

MainClass.java

package com.ilkaygunel.adapter;

public class MainClass {
	public static void main(String[] args) {
		RoundHole hole = new RoundHole(5);
		RoundPeg rpeg = new RoundPeg(5);
		if (hole.fits(rpeg)) {
			System.out.println("Round peg r5 fits round hole r5.");
		}

		SquarePeg smallSqPeg = new SquarePeg(2);
		SquarePeg largeSqPeg = new SquarePeg(20);

		SquarePegAdapter smallSqPegAdapter = new SquarePegAdapter(smallSqPeg);
		SquarePegAdapter largeSqPegAdapter = new SquarePegAdapter(largeSqPeg);
		if (hole.fits(smallSqPegAdapter)) {
			System.out.println("Square peg w2 fits round hole r5.");
		}
		if (!hole.fits(largeSqPegAdapter)) {
			System.out.println("Square peg w20 does not fit into round hole r5.");
		}
	}
}

MainClass sınıfımız içerisindeki main metodumuz içerisinde 5 yarıçap bilgisi ile RoundHole ve RoundPeg tipinde 2 obje oluşturuyoruz. Akabinde hole değişkeni üzerinden fits metodunu çağırıyoruz ve rpeg objesinin hole değişkeni içine sığıp sığmadığını kontrol ediyoruz. Burada ikisinin de yarıçap bilgisi aynı olduğundan Round peg r5 fits round hole r5. metni console’a yazdırılacak.

Akabinde genişlik bilgisi 2 olacak şekilde smallSqPeg değişkenini ve 20 genişlik bilgisi ile largeSqPeg değişkenini oluşturuyoruz. Akabinde smallSqPeg objesini kullanarak smallSqPegAdapter objesini ve largeSqPeg objesini kullanarak largeSqPegAdapter objesini oluşturuyoruz.

Devam eden kısımda tekrar hole değişkeni üzerinden fits metodunu smallSqPegAdapter ve largeSqPegAdapter değişkenlerini parametre olacak şekilde vererek kontrolleri yapıyoruz.fits metodunun içinde peg üzerinden çağırılacak getRadius metodu verdiğimiz adapter objeleri üzerindeki getRadius’u çağıracak ve genişlik bilgisinden üretilen yarıçap bilgisi ile kontrol yapılacak.

Konsol Çıktısı

Konsol çıktısında görebileceğimiz gibi birinci sıradaki metin rpeg’in hole’ün üzerine tam oturarak taşmadığını belirtiyor.

İkinci sıradaki metin ise genişlik bilgisi 2 olan karenin hole çemberinin içine sığdığını belirtiyor. Bu noktada çemberin yarıçap bilgisi kök 2 olacaktır ve bu sayı da 5 değerinden epey küçük.

Üçüncü sıradaki metin de genişlik bilgisi 20 olan karenin hole çemberinin dışına taştığını, içine sığmadığını belirtiyor. Kareyi çevreleyen çemberin yarıçap bilgisi 10 kök 2 olacaktır ve bu da 5 değerinden oldukça büyük bir değerdir.

Bu yazıda anlatacaklarım da bu kadar arkadaşlar. Başka yazıda görüşene kadar sağlıcakla kalın.

NOT: Yazının kapak görseli https://miro.medium.com/max/783/1*KvlbDdR0rjo1MnoJyNZBEw.png adresinden alınmıştır.

2016 İstanbul Üniversitesi Bilgisayar Mühendisliği mezunuyum. Güncel olarak Paycore'da SoftPOS projesinde Java Developer olarak çalışmaktayım. Büyük oranda Java teknolojileri ile uğraşıp kendimi geliştirmeye çalışıyorum.

İlkay Günel

2016 İstanbul Üniversitesi Bilgisayar Mühendisliği mezunuyum. Güncel olarak Paycore'da SoftPOS projesinde Java Developer olarak çalışmaktayım. Büyük oranda Java teknolojileri ile uğraşıp kendimi geliştirmeye çalışıyorum.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir