Bazen bazı classları kullanmak isteriz ama istediğimiz methodlar olmadığından veya zaman içinde başına gelen değişiklikler nedeniyle class kullanılmaz hale gelebilir. Bu gibi durumlarda Adapter modelini kullanarak, class'ın interface'i içindeki methodları kullanılır hale getirebiliriz.


Örnek


Aşağıdaki TaxCalculator class'ın ekibimize ait olmadığını ve üzerinde değişiklik yapabilme durumumuzun olmadığını varsayalım. Tüm yapabileceğimiz, bu class'ı kendi kodumuzda kullanabilmektir.


class TaxCalculator
{
private $amount;
private $rate;

public function setAmountAndRate($amount, $rate)
{
$this->amount = $amount;
$this->rate = $rate;

return $this;
}

public function calculate()
{
return $this->amount * $this->rate;
}
}

Class'ı şu şekilde kullanabiliriz.


$taxCalculator = new TaxCalculator();
echo $taxCalculator->setAmountAndRate(100, 0.5)->calculate();

Yukarıdaki kodu bir çok yerde kullandığımızı ve aynı zamanda diğer takımın TaxCalculator class'ı aşağıdaki şekilde değiştirdiğini varsayalım.


class TaxCalculator
{
private $amount;
private $rate;

public function setAmount($amount)
{
$this->amount = $amount;

return $this;
}

public function getAmount()
{
return $this->amount;
}

public function setRate($rate)
{
$this->rate = $rate;

return $this;
}

public function getRate()
{
return $this->rate;
}

public function calculate()
{
return $this->amount * $this->rate;
}
}

Yukarıda gördüğümüz gibi, setAmountAndRate methodu iki değişik methoda ayrıldığı için, aşağıdaki kod çalışmayacaktır.


$taxCalculator = new TaxCalculator();
echo $taxCalculator->setAmountAndRate(100, 0.5)->calculate();

Yapılan değişiklikler nedeniyle, orjinal kodu aşağıdaki gibi değiştirmemiz gerekecek.


$taxCalculator = new TaxCalculator();
echo $taxCalculator->setAmount(100)->setRate(0.5)->calculate();

Eğer değişen kodu uygulamamız içinde birçok yerde kullandıysak, yapmamız gereken değişiklikler yorucu olacaktır. İleride TaxCalculator class'ın tekrar değişebileceğini bilmediğimiz için, yaptığımız değişiklikleri tekrar yapmak zorunda kalabiliriz. Buna benzer problemlerle karşılaşmak istemiyorsak, aşağıdaki class'ı kullanmamız gerekecek.


interface AdapterInterface
{
public function calculate();
}

class TaxCalculatorAdapter implements AdapterInterface
{
public $taxCalculator;

public function __construct(TaxCalculator $taxCalculator)
{
$this->taxCalculator = $taxCalculator;
}

public function calculate()
{
return $this->taxCalculator->getAmount() * $this->taxCalculator->getRate();
}
}

$taxCalculator = new TaxCalculator();
$taxCalculator->setAmount(100)->setRate(0.5);

$taxCalculatorAdapter = new TaxCalculatorAdapter($taxCalculator);
echo $taxCalculatorAdapter->calculate();

Eğer TaxCalculator ileride tekrar değişirse, tüm yapmamız gereken, sadece TaxCalculatorAdapter class'ını değiştirmek olacaktır.