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
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
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
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
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
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.