Middle+
Kuo skiriasi 'adapter' ir 'decorator' modeliai?
sobes.tech AI
Atsakymas iš AI
Adapteris keičia vieno klases sąsają į kitą, kurioje tikimasi kitos klasės, užtikrinant suderinamumą tarp nesuderinamų sąsajų. Keičia esamų metodų parašus, kad atitiktų naują sąsają.
Dekoratorius dinamiškai prideda naujas pareigas objektui, apvyniodamas jį dekoratoriumi. Nekeičia dekoruojamo objekto sąsajos, tik išplečia jo funkcionalumą.
| Kriterijus | Adapteris | Dekoratorius |
|---|---|---|
| Tikslas | Sąsajų suderinamumas | Funkcionalumo išplėtimas |
| Sąsajos keitimas | Taip, paverčia vieną į kitą | Ne, išlaiko esamą |
| Struktūra | Apvynioja pritaikomą objektą | Apvynioja dekoruojamą objektą |
| Elgsena | Keičia iškvietimus dekoruojamam objektui | Prideda naujas veiklas arba keičia esamas |
| Pavyzdys | XML konvertavimas į JSON | Logavimo pridėjimas prie esamo klases |
<?php
// Adapterio pavyzdys
interface TargetInterface {
public function request();
}
class Adaptee {
public function specificRequest() {
echo "Adaptee specifinis užklausimas" . PHP_EOL;
}
}
class Adapter implements TargetInterface {
private $adaptee;
public function __construct(Adaptee $adaptee) {
$this->adaptee = $adaptee;
}
public function request() {
// Pakeisti iškvietimą
$this->adaptee->specificRequest();
}
}
// Dekoratoriaus pavyzdys
interface Component {
public function operation();
}
class ConcreteComponent implements Component {
public function operation() {
echo "Konkretus komponento veiksmas" . 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 "Pridėtas elgesys A" . PHP_EOL;
}
}