Middle+
Mis vahe on 'adapteri' ja 'decoratori' mustritel?
sobes.tech AI
Vastus AI-lt
Adapter muudab ühe klassi liidese teiseks, mida teine klass ootab, pakkudes ühilduvust mittesobivate liideste vahel. Muudab olemasolevate meetodite allkirju, et need vastaksid uuele liidesele.
Dekorator lisab objekti dünaamiliselt uusi kohustusi, mähkides selle dekoratsiooniga. Ei muuda dekoratiivse objekti liidest, vaid ainult laiendab selle funktsionaalsust.
| Kriteerium | Adapter | Dekorator |
|---|---|---|
| Eesmärk | Liideste ühilduvus | Funktsionaalsuse laiendamine |
| Liidese muutmine | Jah, muudab ühe teiseks | Ei, säilitab olemasoleva |
| Struktuur | Mähib kohandatavat objekti | Mähib dekoratiivset objekti |
| Käitumine | Muudab väljakutseid kohandatud objekti jaoks | Lisab uusi tegevusi või muudab olemasolevaid |
| Näide | XML konverteerimine JSON-ks | Logimise lisamine olemasolevale klassile |
<?php
// Adapteri näide
interface TargetInterface {
public function request();
}
class Adaptee {
public function specificRequest() {
echo "Adaptee spetsiifiline nõue" . PHP_EOL;
}
}
class Adapter implements TargetInterface {
private $adaptee;
public function __construct(Adaptee $adaptee) {
$this->adaptee = $adaptee;
}
public function request() {
// Väljakutse muutmine
$this->adaptee->specificRequest();
}
}
// Dekoratsiooni näide
interface Component {
public function operation();
}
class ConcreteComponent implements Component {
public function operation() {
echo "Konkreetne komponendi operatsioon" . 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 "Lisatud käitumine A" . PHP_EOL;
}
}