Шаблон проектирования Адаптер.
Основное назначение шаблона проектирования Адаптер понятно из названия – он адаптирует элементы для работы в различных средах. Если говорить более конкретно, то адаптер – это класс-обортка для основного класса, предоставляющий другой способ доступа к нему.
Теперь подробно.
Обычно, этот шаблон используют в одном из трех случаев:
- Когда нужно чтобы один класс работал с другими классами, непохожими друг на друга. В этом случае для основного класса создается адаптер для одного из двух других (или для каждого). Ниже подробнее опишу это.
- Приспособить один из старых компонентов для работы в текущей системе или просто обновить интерфейс какого-то класса.
Допустим, у нас есть три класса: основной и два других. У основного класса есть два метода getPrice() и getDiscount() – для получения цены и скидки. Остальные два класса обращаются к первому классу, причем первому классу нужны оба метода, а второму, нужно чтобы метод возвращал цену сразу с учетом скидки. В этом случае классы оказываются несовместимыми. И тут на помощь приходит Адаптер.
Чтобы стало все понятно, рассмотрим это на примере.
class Product { private $price; private $discount; function __construct($price, $discount) { $this->price = $price; $this->discount = $discount; } function getPrice() { return $this->price; } function getDiscount() { return $this->discount; } } class ProductAdapter { private $products; function __construct(Product $product) { $this->product = $product; } function getPrice() { return $this->product->getPrice() - $this->product->getDiscount(); } }
Теперь в тех двух классах обратиться к продукту можно двумя способами:
// Для первого класса $product1 = new Product(100, 20); echo 'Discounted price = '.($product1->getPrice() - $product1->getDiscount()); // Для второго класса $product2 = new ProductAdapter($product1); echo 'Discounted price = '.$product2->getPrice();
В обоих случаях будет выведено “Discounted price = 80″.
Из примера видно, что основное назначение шаблона проектирования Адаптер – это изменение текущего интерфейса доступа к экземпляру класса.
Если делать аналогию с реальным миром, то вспомните блок адаптер от сотового телефона, через который вы подключаете его к розетке для подзарядки.
Удачи
Хороший пост. Мне вообще нравится как вы доступно излогаете материал.
Спасибо
А вот я вот не совсем видимо понял для чего нужен данный паттерн. Ведь можно сделать просто расширить класс Product и не плодить дополнительные классы?
Как этот пример связан с паттерном Адаптер? Автор, почитайте литературу, прежде чем вводить в заблуждение других.