Sobes.tech
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;
    }
}