Sobes.tech
Middle+

Ի՞նչ է տարբերությունը 'adaptér' և 'decorator' ձևանմուշների միջև։

sobes.tech AI

Պատասխան AI-ից

Ադապտեր փոխում է մեկ դասի ինտերֆեյսը այն ինտերֆեյսին, որը սպասում է մյուս դասը, ապահովելով անհամատեղելի ինտերֆեյսների միջև համատեղելիություն։ Փոխում է առկա մեթոդների ստորագրությունը՝ համապատասխան նոր ինտերֆեյսին։

Դեկորատոր դինամիկ կերպով ավելացնում է նոր պարտավորություններ օբյեկտին՝ այն շրջապատելով դեկորատորով։ Չի փոխում դեկորատորացված օբյեկտի ինտերֆեյսը, այլ ընդլայնում է նրա գործառույթը։

Կատեգորիա Ադապտեր Դեկորատոր
Նպատակը Ինտերֆեյսների համատեղելիություն Գործառույթների ընդլայնում
Ինտերֆեյսի փոփոխություն Այո, փոխում մեկին մյուսով Ոչ, պահպանում է առկա
Կառուցվածք Շրջապատում է հարմարեցվող օբյեկտը Շրջապատում է դեկորատորացված օբյեկտը
Կերպափոխություն Փոխում է կանչերը հարմարեցված օբյեկտի համար Ավելացնում է նոր գործողություններ կամ փոխում է առկա ones
Օրինակ XML-ի փոխարկում JSON-ով Լոգավորման ավելացում առկա դասին
<?php

// Օրինակ Ադապտեր
interface TargetInterface {
    public function request();
}

class Adaptee {
    public function specificRequest() {
        echo "Հատուկ պահանջը Adaptee-ից" . PHP_EOL;
    }
}

class Adapter implements TargetInterface {
    private $adaptee;

    public function __construct(Adaptee $adaptee) {
        $this->adaptee = $adaptee;
    }

    public function request() {
        // Փոխարկում կանչը
        $this->adaptee->specificRequest();
    }
}

// Օրինակ Դեկորատոր
interface Component {
    public function operation();
}

class ConcreteComponent implements Component {
    public function operation() {
        echo "Կոնկրետ կոմպոնենտի գործողություն" . 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 "Ավելացված վարքագիծ A" . PHP_EOL;
    }
}