Sobes.tech
Middle+

'Adaptör' ve 'dekoratör' desenleri arasındaki fark nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Adapter bir sınıfın arayüzünü başka bir sınıfın beklediği arayüze dönüştürür ve uyumsuz arayüzlere sahip sınıflar arasında uyumluluk sağlar. Mevcut metodların imzasını yeni arayüze uygun hale getirmek için değiştirir.

Dekoratör nesneye dinamik olarak yeni sorumluluklar ekler, onu dekoratör ile sarmalayarak. Dekor edilen nesnenin arayüzünü değiştirmez, sadece işlevselliğini genişletir.

Kriter Adaptör Dekoratör
Hedef Arayüz uyumluluğu İşlevselliğin genişletilmesi
Arayüz değişikliği Evet, bir arayüzü diğerine dönüştürür Hayır, mevcut arayüzü korur
Yapı Uyum sağlanan nesneyi sarmalar Dekore edilen nesneyi sarmalar
Davranış Çağrıları değiştirir veya yönlendirir Yeni işlemler ekler veya mevcutları değiştirir
Örnek XML'den JSON'a dönüşüm Mevcut bir sınıfa logging ekleme
<?php

// Adaptör örneği
interface TargetInterface {
    public function request();
}

class Adaptee {
    public function specificRequest() {
        echo "Özel Adaptee isteği" . PHP_EOL;
    }
}

class Adapter implements TargetInterface {
    private $adaptee;

    public function __construct(Adaptee $adaptee) {
        $this->adaptee = $adaptee;
    }

    public function request() {
        // Çağrıyı dönüştürme
        $this->adaptee->specificRequest();
    }
}

// Dekoratör örneği
interface Component {
    public function operation();
}

class ConcreteComponent implements Component {
    public function operation() {
        echo "Somut bileşen işlemi" . PHP_EOL;
    }
}

class Decorator implements Component {
    protected $component;

    public function __construct(Component $component) {
        $this->component = $component;
    }

    public function operation() {
        $this->component->operation();
    }
}

class ConcreteDecoratorA extends Decorator {
    public function operation() {
        parent::operation();
        $this->addedBehaviorA();
    }

    private function addedBehaviorA() {
        echo "Eklendi davranış A" . PHP_EOL;
    }
}