Адаптер
Аналогія
Допустимо, у вас на карті пам'яті є якісь картинки. Їх слід перенести на комп'ютер. Потрібен адаптер, сумісний із портом комп'ютера, в який можна вставити картку пам'яті. У цьому прикладі адаптер - це картридер. Ще один приклад: перехідник, що дозволяє використовувати американський блок живлення із російською розеткою. Третій приклад: перекладач — це адаптер, що з'єднує двох людей, які розмовляють різними мовами.
Стисло
Шаблон «Адаптер» дозволяє помістити несумісний об'єкт в обгортку, щоб він був сумісним із іншим класом.
Вікіпедія
Шаблон проектування "Адаптер" дозволяє використовувати інтерфейс існуючого класу як інший інтерфейс. Цей шаблон часто застосовується для роботи одних класів з іншими без зміни їх вихідного коду. Приклад
Уявімо мисливця на левів.
Створимо інтерфейс 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);