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;
}
}