Всем привет! Сегодня поговорим о шаблоне проектирования Адаптер(Pattern Adapter) . Как понятно из названия, служит он для того, чтобы что-то адаптировать , но вот что? А на этот вопрос вам ответит эта статья.
Всем привет! Сегодня поговорим о шаблоне проектирования Адаптер(Pattern Adapter). Как понятно из названия, служит он для того, чтобы что-то адаптировать, но вот что? А на этот вопрос вам ответит эта статья.
Описание шаблона проектирования Адаптер
Давайте немного отойдем от программирования и посмотрим на адаптеры в реальной жизни. К примеру, вы купили какую-то технику(например, компьютер) за границей. Приехав с ней домой, вы обнаружили, что вилка другого стандарта и в нашу, российскую розетку, не подходит. Что же делать? Правильно! Нужно пойти в магазин и купить переходник, используя который вы сможет подключить ваш компьютер в сеть. Так вот, этот переходник и есть адаптер. В него мы вставляем иностранную вилку, а сам адаптер включаем в сеть и все прекрасно работает. Т.е. он служит просто прослойкой между нашей розеткой и иностранной вилкой.
Итак, думаю, что вы разобрались, что такое адаптер в жизни. В программировании - это то же самое.
Пример реализации адаптера на PHP
<?php
interface iMain {
public function send();
}
interface iAdaptee {
public function inquiry();
}
class Adaptee implements iAdaptee {
public function inquiry() {
return __CLASS__."::".__METHOD__;
}
}
class Adapter implements iMain {
protected $adaptee = null;
public function __construct() {
$this->adaptee = new Adaptee();
}
public function send() {
return $this->adaptee->inquiry();
}
}
$goal = new Adapter();
echo $goal->send(); // "Adaptee::inquiry"
?>
Итак, вот наш код. Давайте разбираться. У нас есть интерфейс iMain, клиентский код умеет работать с ним. Дальше у нас есть интерфейс iAdaptee, с которым клиентский код работать не умеет, но нам необходимо как-то с ним взаимодействовать. Потом у нас есть класс Adaptee, который наследует интерфейс iAdaptee и внутри у него есть метод с именем inquiry, который просто возвращает строку вида CLASS::METHOD. Вот мы подошли к классу Adapter, который наследует интерфейс iMain. Внутри него мы создаем защищенное свойство adaptee, равное null. Дальше в конструкторе мы создаем объект класса Adaptee и записываем его в наше защищенное свойство. В методе send мы возвращаем вызов метода inquiry.
Вот и все. Теперь создаем объект нашего адаптера и вызываем метод send.
Т.е. вся суть в том, что мы можем работать с одним интерфейсом, но не можем с другим и, чтобы как-то взаимодействовать с этим недоступным нам интерфейсом, мы и создаем адаптер, прослойку, через которую и реализуем нашу задачу.
Заключение
Сейчас вам может показаться, что все очень сложно и трудно, но это не так. Думаю, смысл адаптера вы поняли, а теперь вам нужно больше практики. Просмотрите еще раз код, который дан в этом материале, и попытайтесь его осмыслить. Строчка за строчку просматривайте и проговаривайте его, как будто вы интерпретатор php. Также, советую просмотреть код какого-нибудь фреймворка, ведь там этот шаблон используется довольно часто.
На этом я заканчиваю эту немаленькую статью, спасибо за внимание!
