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