Адаптер

Аналогія

Допустимо, у вас на карті пам'яті є якісь картинки. Їх слід перенести на комп'ютер. Потрібен адаптер, сумісний із портом комп'ютера, в який можна вставити картку пам'яті. У цьому прикладі адаптер - це картридер. Ще один приклад: перехідник, що дозволяє використовувати американський блок живлення із російською розеткою. Третій приклад: перекладач — це адаптер, що з'єднує двох людей, які розмовляють різними мовами.

Стисло

Шаблон «Адаптер» дозволяє помістити несумісний об'єкт в обгортку, щоб він був сумісним із іншим класом.

Вікіпедія

Шаблон проектування "Адаптер" дозволяє використовувати інтерфейс існуючого класу як інший інтерфейс. Цей шаблон часто застосовується для роботи одних класів з іншими без зміни їх вихідного коду. Приклад

Уявімо мисливця на левів.

Створимо інтерфейс Lion, який продає всі типи левів.

interface Lion
{
    public function roar();
}

class AfricanLion implements Lion
{
    public function roar()
    {
    }
}

class AsianLion implements Lion
{
    public function roar()
    {
    }
}

Мисливець повинен полювати на всі продажі інтерфейсу Lion.

class Hunter
{
    public function hunt(Lion $lion)
    {
    }
}

Додамо тепер дикої собаки WildDog, на яку мисливець теж може полювати. Але нам не вдасться зробити це безпосередньо, тому що у собаки інший інтерфейс. Щоб вона стала сумісною з мисливцем, потрібно створити відповідний адаптер.

// Це потрібно додати
class WildDog
{
    public function bark()
    {
    }
}

// Адаптер навколо собаки зробить її сумісною з мисливцем
class WildDogAdapter implements Lion
{
    protected $dog;

    public function __construct(WildDog $dog)
    {
        $this->dog = $dog;
    }

    public function roar()
    {
        $this->dog->bark();
    }
}

Тепер WildDog може розпочати гру завдяки WildDogAdapter.

$wildDog = новий WildDog();
$wildDogAdapter = новий WildDogAdapter($wildDog);

$ hunter = New Hunter ();
$hunter->hunt($wildDogAdapter);