Middle+
Фарқи байни намунаҳои 'адаптер' ва 'декоратор' чист?
sobes.tech AI
Ҷавоб аз AI
Адаптер преобразує інтерфейс одного класу у інтерфейс, який очікує інший клас, забезпечуючи сумісність між класами з несумісними інтерфейсами. Змінює сигнатуру існуючих методів для відповідності новому інтерфейсу.
Декоратор динамічно додає нові обов'язки об'єкту, обгортаючи його у декоратор. Не змінює інтерфейс декорованого об'єкта, а лише розширює його функціональність.
| Критерій | Адаптер | Декоратор |
|---|---|---|
| Мета | Сумісність інтерфейсів | Розширення функціональності |
| Зміна інтерфейсу | Так, перетворює один в інший | Ні, зберігає існуючий |
| Структура | Обгортає адаптований об'єкт | Обгортає декорований об'єкт |
| Поведінка | Змінює виклики до адаптованого об'єкта | Додає нові дії або змінює існуючі |
| Приклад | Перетворення XML у JSON | Додавання логування до існуючого класу |
<?php
// Приклад Адаптера
interface TargetInterface {
public function request();
}
class Adaptee {
public function specificRequest() {
echo "Специфічний запит від Adaptee" . PHP_EOL;
}
}
class Adapter implements TargetInterface {
private $adaptee;
public function __construct(Adaptee $adaptee) {
$this->adaptee = $adaptee;
}
public function request() {
// Перетворення виклику
$this->adaptee->specificRequest();
}
}
// Приклад Декоратора
interface Component {
public function operation();
}
class ConcreteComponent implements Component {
public function operation() {
echo "Конкретна операція компонента" . PHP_EOL;
}
}
class Decorator implements Component {
protected $component;
public function __construct(Component $component) {
$this->component = $component;
}
public function operation() {
$this->component->operation();
}
}
class ConcreteDecoratorA extends Decorator {
public function operation() {
parent::operation();
$this->addedBehaviorA();
}
private function addedBehaviorA() {
echo "Додане поведінка A" . PHP_EOL;
}
}