PHP örneği ile adapter design pattern

Kadir Doğuş Seçkin
2 min readSep 16, 2023

--

Design patternler, yazılım geliştirirken ortaya çıkan sorunlara yönelik genel tekarlanabilir çözümler sunar. Her yazılım deseni bazı yaygın sorunlara çözüm üretir. Bize bir şablon sunar ve biz bunu kendi kodumuza göre özelleştirebiliriz.

Structural design pattern kategorisine giren adapter design pattern, uyumsuz interface yapısına sahip farklı nesnelerin uyum içinde çalışmasına olanak sağlar.

Aynı interface ile çalışan yapımıza farklı bir class eklediğimizde bizi tüm kodu değiştirmekten kurtarır. Sadece ilgili class için bir adapter class yazarak aynı yapıyla çalışmaya devam edebiliriz.

Bu anlatılanları PHP ile koda dökelim. Projemizde müşterilere belirli aralıklarla sms ve e-mail yollayan bir yapımız olduğunu varsayalım. Bunun için aşağıdaki gibi bir kodumuz olsun.

interface INotification {
function send();
}

class Sms implements INotification {
public function send()
{
// Sending sms
}
}

class Email implements INotification {

public function send()
{
// Sending email
}
}

INotification adlı bir arayüzümüz var. Email ve sms sınıflarımız bu arayüzden türüyor ve send metodu içinde kendilerine özel işlemleri yapıyorlar. Kurduğumuz yapıda email, sms veya başka bir tür olması farketmeksizin send metodu üzerinden işlemlerimizi yürütüyoruz.

Sistemimize mobil cihazlara bildirim gönderme özelliğide eklemek istediğimizi ve bunun için farklı bir kütüphane kullandığımızı varsayalım.

class AppPush {
public function pushNotification()
{
// Push notification to mobile app
}
}

Bu kütüphane yukarıdaki gibi bir class ve fonksiyona sahip olsun. Gördüğünüz gibi bizim yapımızdaki gibi bir send metoduna sahip değil. Farklı bir kütüphane kullandığımız direkt bu sınıfın ve metodun içine müdahele edemeyiz. Bu sınıfa göre kalan tüm yapımızı değiştirmeye kalksak yine çok doğru bir yaklaşım olmaz.

Tam bu durumda imdadımıza adapter design pattern yetişiyor. Bu sınıfımızı içine alacak şekilde bir AppPushAdapter sınıfı yazıp bizim send metodumuzla çalışacak hale getirirsek ne ilgili sınıfta ne de kendi yapımızda bir değişiklik yapmaya gerek kalmadan kodumuzu çalıştırmaya devam edebiliriz.

class AppPushAdapter implements INotification {
private AppPush $appPush;

public function __construct(AppPush $appPush)
{
$this->appPush = $appPush;
}

public function send()
{
$this->appPush->pushNotification();
}
}

Gördüğünüz üzere AppPush sınıfının kendine has yaptığı işlemleri yine send metodunun içine koyduk ve adapter sınıfımızı INotification arayüzünden türettik.

$notifications = [
new Sms(),
new Email(),
new AppPushAdapter(new AppPush())
];

foreach ($notifications as $notification) {
sendNotification($notification);
}

function sendNotification(INotification $notification) {
$notification->send();
}

Bu sayede farklı sınıfları yapımızı değiştirmeden kodumuza adapte edebilmiş olduk.

--

--