Middle+
Mi a különbség az 'adapter' és a 'decorátor' minták között?
sobes.tech MI
Válasz az MI-től
Adapter átalakítja egy osztály interfészét egy másik osztály által elvárt interfésszé, biztosítva az inkompatibilis interfészekkel rendelkező osztályok közötti kompatibilitást. Megváltoztatja a meglévő metódusok aláírását, hogy megfeleljen az új interfésznek.
Dekorátor dinamikusan új felelősségeket ad egy objektumnak, azzal, hogy dekorátorba csomagolja. Nem változtatja meg a dekorált objektum interfészét, csak kibővíti funkcionalitását.
| Kritérium | Adapter | Dekorátor |
|---|---|---|
| Cél | Interfészek kompatibilitása | Funkcionalitás bővítése |
| Interfész változtatás | Igen, egyet másikra alakít át | Nem, megőrzi a meglévőt |
| Struktúra | Körülveszi az alkalmazkodó objektumot | Körülveszi a dekorált objektumot |
| Viselkedés | Megváltoztatja a hívásokat az alkalmazkodó objektumhoz | Új műveleteket ad hozzá vagy módosítja a meglévőket |
| Példa | XML-ből JSON-be való átalakítás | Naplózás hozzáadása egy meglévő osztályhoz |
<?php
// Adapter példa
interface TargetInterface {
public function request();
}
class Adaptee {
public function specificRequest() {
echo "Specifikus kérés az Adaptee-től" . PHP_EOL;
}
}
class Adapter implements TargetInterface {
private $adaptee;
public function __construct(Adaptee $adaptee) {
$this->adaptee = $adaptee;
}
public function request() {
// Hívás átalakítása
$this->adaptee->specificRequest();
}
}
// Dekorátor példa
interface Component {
public function operation();
}
class ConcreteComponent implements Component {
public function operation() {
echo "Konkrét komponens művelete" . 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 "Hozzáadott viselkedés A" . PHP_EOL;
}
}