Шаблон проектирования Адаптер.
Основное назначение шаблона проектирования Адаптер понятно из названия – он адаптирует элементы для работы в различных средах. Если говорить более конкретно, то адаптер – это класс-обортка для основного класса, предоставляющий другой способ доступа к нему.
Теперь подробно.
Обычно, этот шаблон используют в одном из трех случаев:
- Когда нужно чтобы один класс работал с другими классами, непохожими друг на друга. В этом случае для основного класса создается адаптер для одного из двух других (или для каждого). Ниже подробнее опишу это.
- Приспособить один из старых компонентов для работы в текущей системе или просто обновить интерфейс какого-то класса.
Допустим, у нас есть три класса: основной и два других. У основного класса есть два метода 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″.
Из примера видно, что основное назначение шаблона проектирования Адаптер – это изменение текущего интерфейса доступа к экземпляру класса.
Если делать аналогию с реальным миром, то вспомните блок адаптер от сотового телефона, через который вы подключаете его к розетке для подзарядки.
Удачи


Ноябрь 7th, 2008
Хороший пост. Мне вообще нравится как вы доступно излогаете материал.
Ноябрь 7th, 2008
Спасибо