Middle+
V čom spočíva rozdiel medzi vzormi 'adaptér' a 'dekorátor'?
sobes.tech AI
Odpoveď od AI
Adapter preoblikuje sučelje jednog razreda u sučelje koje očekuje drugi razred, pružajući kompatibilnost između razreda s nespojivim sučeljima. Mijenja potpis postojećih metoda kako bi odgovarale novom sučelju.
Dekorator dinamički dodaje nove obveze objektu, obavijajući ga u dekorator. Ne mijenja sučelje dekoriranog objekta, već samo proširuje njegovu funkcionalnost.
| Kriterij | Adapter | Dekorator |
|---|---|---|
| Svrha | Kompatibilnost sučelja | Proširenje funkcionalnosti |
| Promjena sučelja | Da, pretvara jedno u drugo | Ne, zadržava postojeće |
| Struktura | Obavija prilagođeni objekt | Obavija dekorirani objekt |
| Ponašanje | Mijenja pozive prema prilagođenom objektu | Dodaje nove radnje ili mijenja postojeće |
| Primjer | Pretvaranje XML u JSON | Dodavanje logiranja postojećem razredu |
<?php
// Primjer Adaptera
interface TargetInterface {
public function request();
}
class Adaptee {
public function specificRequest() {
echo "Specifičan zahtjev od Adaptee" . PHP_EOL;
}
}
class Adapter implements TargetInterface {
private $adaptee;
public function __construct(Adaptee $adaptee) {
$this->adaptee = $adaptee;
}
public function request() {
// Pretvaranje poziva
$this->adaptee->specificRequest();
}
}
// Primjer Dekoratora
interface Component {
public function operation();
}
class ConcreteComponent implements Component {
public function operation() {
echo "Konkretna operacija komponente" . 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 "Dodano ponašanje A" . PHP_EOL;
}
}